回答編集履歴

3

フォーマンスを向上させた

2018/01/06 19:18

投稿

MasakiHori
MasakiHori

スコア3384

test CHANGED
@@ -120,11 +120,21 @@
120
120
 
121
121
  }
122
122
 
123
+ // 要素数が 2 * num 以下の時
124
+
125
+ if count <= num * 2 {
126
+
127
+
128
+
129
+ return [Array<Element>(self[0..<num])]
130
+
131
+ + [Array<Element>(self[num...])]
132
+
133
+ }
134
+
123
135
 
124
136
 
125
137
  // 前半の要素数が num の整数倍になるように分割点を求める
126
-
127
- // 後半の要素数が多くなるように設定
128
138
 
129
139
  let splitPoint = Int(count / num / 2) * num
130
140
 
@@ -160,13 +170,11 @@
160
170
 
161
171
  default:
162
172
 
163
- // 後半の要素数が num 以上の時
173
+ // ここには到達しない
164
174
 
165
175
 
166
176
 
167
- return [Array<Element>(self[0..<num])]
177
+ fatalError("Not reachable")
168
-
169
- + Array<Element>(self[num..<count]).split(num: num)
170
178
 
171
179
  }
172
180
 

2

パフォーマンスを向上させた

2018/01/06 19:18

投稿

MasakiHori
MasakiHori

スコア3384

test CHANGED
@@ -59,3 +59,119 @@
59
59
  let splited = myClasses.split(num: 2)
60
60
 
61
61
  ```
62
+
63
+
64
+
65
+
66
+
67
+ ---
68
+
69
+ 追記
70
+
71
+
72
+
73
+ あまりにもパフォーマンスが悪すぎるので書き直しました。
74
+
75
+ 多分O(N)ぐらいになってます。
76
+
77
+ 複雑になったので説明コメント多めです。
78
+
79
+
80
+
81
+ ```swift
82
+
83
+ extension Array {
84
+
85
+
86
+
87
+ /// 配列を要素数が num の配列の配列にする
88
+
89
+ ///
90
+
91
+ /// let array = [1, 2, 3, 4, 5]
92
+
93
+ /// let splited = array.split(num: 2)
94
+
95
+ /// print(splited)
96
+
97
+ /// // [[1, 2], [3, 4], [5]]
98
+
99
+ func split(num: Int) -> [[Element]] {
100
+
101
+
102
+
103
+ /// 配列を半分に分けて前半後半それぞれをもう一度半分に分ける
104
+
105
+ /// これを要素数が num 以下になるまで繰り返す
106
+
107
+
108
+
109
+ let count = self.count
110
+
111
+
112
+
113
+ // 要素数が num 以下の時
114
+
115
+ if count <= num {
116
+
117
+
118
+
119
+ return [self]
120
+
121
+ }
122
+
123
+
124
+
125
+ // 前半の要素数が num の整数倍になるように分割点を求める
126
+
127
+ // 後半の要素数が多くなるように設定
128
+
129
+ let splitPoint = Int(count / num / 2) * num
130
+
131
+
132
+
133
+ switch splitPoint {
134
+
135
+
136
+
137
+ case num:
138
+
139
+ // 前半の要素数が num の時
140
+
141
+
142
+
143
+ return [Array<Element>(self[0..<num])]
144
+
145
+ + Array<Element>(self[num..<count]).split(num: num)
146
+
147
+
148
+
149
+ case (num...):
150
+
151
+ // 前半の要素数が num 以上の時
152
+
153
+
154
+
155
+ return Array<Element>(self[0..<splitPoint]).split(num: num)
156
+
157
+ + Array<Element>(self[splitPoint..<count]).split(num: num)
158
+
159
+
160
+
161
+ default:
162
+
163
+ // 後半の要素数が num 以上の時
164
+
165
+
166
+
167
+ return [Array<Element>(self[0..<num])]
168
+
169
+ + Array<Element>(self[num..<count]).split(num: num)
170
+
171
+ }
172
+
173
+ }
174
+
175
+ }
176
+
177
+ ```

1

少しだけ早く

2018/01/06 18:25

投稿

MasakiHori
MasakiHori

スコア3384

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- if source.count < num {
27
+ if source.count <= num {
28
28
 
29
29
  return (divided + [source], [])
30
30