いつどこでなぜ使うのかよくわかってませんが、できてしまったので記しておきます。
多分 O(N) です。
extension Array {
/// 配列を要素数が num の配列の配列にする
///
/// let array = [1, 2, 3, 4, 5]
/// let splited = array.split(num: 2)
/// print(splited)
/// // Prints "[[1, 2], [3, 4], [5]]"
///
/// Complexity: O(N)
func split(num: Int) -> [[Element]] {
/// 配列を半分に分けて前半後半それぞれをもう一度半分に分ける
/// これを要素数が num 以下になるまで繰り返す
// countはO(N)なので定数に押さえておく
let count = self.count
// 要素数が num 以下の時 除算の回数を減らすため早期return
if count <= num {
return [self]
}
// 要素数が 2 * num 以下の時 除算の回数を減らすため早期return
if count <= num * 2 {
return [Array(self[0..<num]), Array(self[num...])]
}
// 前半の要素数が num の整数倍になるように分割点を求める
let splitPoint = Int(count / num / 2) * num
switch splitPoint {
// 前半の要素数が num の時
case num:
return [Array(self[0..<num])]
+ Array(self[num...]).split(num: num)
// 前半の要素数が num 以上の時
case (num...):
return Array(self[0..<splitPoint]).split(num: num)
+ Array(self[splitPoint...]).split(num: num)
default:
fatalError("ここには到達しない")
}
}
}