@@ -134,11 +134,13 @@ graph LR
134134
135135** 実装比較** :
136136
137- | 実装方法 | Runtime | Memory | 特徴 |
138- | ---------------------------- | ------- | ------ | ------------------------ |
139- | 基本版(Array.from) | ~ 158ms | ~ 69MB | 可読性高、標準的 |
140- | 最適化版(ビット演算) | ~ 140ms | ~ 68MB | ビット演算で10-15%高速化 |
141- | 高速化版(変数キャッシング) | ~ 125ms | ~ 67MB | Top 10-15%目標 |
137+ | 実装方法 | Runtime\* | Memory | 特徴 |
138+ | ---------------------------- | --------- | ------ | ------------------ |
139+ | 基本版(Array.from) | ~ 158ms | ~ 69MB | 可読性高、標準的 |
140+ | 最適化版(ビット演算) | ~ 140ms | ~ 68MB | ビット演算で高速化 |
141+ | 高速化版(変数キャッシング) | ~ 125ms | ~ 67MB | 更なる高速化 |
142+
143+ _ \* 数値は特定環境での測定例です_
142144
143145---
144146
@@ -149,7 +151,7 @@ graph LR
149151``` typescript
150152declare global {
151153 interface Array <T > {
152- snail(rowsCount : number , colsCount : number ): number [][];
154+ snail(rowsCount : number , colsCount : number ): T [][];
153155 }
154156}
155157
@@ -161,17 +163,14 @@ declare global {
161163 * @returns 2D配列(Snail pattern)、無効な入力の場合は空配列
162164 * @complexity Time: O(n), Space: O(n) where n = this.length
163165 */
164- Array .prototype .snail = function (rowsCount : number , colsCount : number ): number [][] {
166+ Array .prototype .snail = function (rowsCount : number , colsCount : number ): T [][] {
165167 // 入力バリデーション
166168 if (rowsCount * colsCount !== this .length ) {
167169 return [];
168170 }
169171
170172 // 結果配列の初期化
171- const result: number [][] = Array .from (
172- { length: rowsCount },
173- () => new Array <number >(colsCount ),
174- );
173+ const result: T [][] = Array .from ({ length: rowsCount }, () => new Array <T >(colsCount ));
175174
176175 // Snail traversal pattern実装
177176 for (let i = 0 ; i < this .length ; i ++ ) {
@@ -184,7 +183,7 @@ Array.prototype.snail = function (rowsCount: number, colsCount: number): number[
184183 // 偶数列: 上から下、奇数列: 下から上
185184 const row = col % 2 === 0 ? positionInCol : rowsCount - 1 - positionInCol ;
186185
187- result [row ]! [col ] = this [i ] as number ;
186+ result [row ]! [col ] = this [i ] as T ;
188187 }
189188
190189 return result ;
@@ -196,20 +195,20 @@ Array.prototype.snail = function (rowsCount: number, colsCount: number): number[
196195``` typescript
197196declare global {
198197 interface Array <T > {
199- snail(rowsCount : number , colsCount : number ): number [][];
198+ snail(rowsCount : number , colsCount : number ): T [][];
200199 }
201200}
202201
203202/**
204203 * Snail traversal(最適化版)
205204 * ビット演算と整数除算でパフォーマンス向上
206205 */
207- Array .prototype .snail = function (rowsCount : number , colsCount : number ): number [][] {
206+ Array .prototype .snail = function (rowsCount : number , colsCount : number ): T [][] {
208207 const n = this .length ;
209208 if (rowsCount * colsCount !== n ) return [];
210209
211210 // 1段階での配列初期化
212- const result: number [][] = [];
211+ const result: T [][] = [];
213212 for (let i = 0 ; i < rowsCount ; i ++ ) {
214213 result [i ] = [];
215214 }
@@ -232,16 +231,16 @@ Array.prototype.snail = function (rowsCount: number, colsCount: number): number[
232231``` typescript
233232declare global {
234233 interface Array <T > {
235- snail(rowsCount : number , colsCount : number ): number [][];
234+ snail(rowsCount : number , colsCount : number ): T [][];
236235 }
237236}
238237
239- Array .prototype .snail = function (rowsCount : number , colsCount : number ): number [][] {
238+ Array .prototype .snail = function (rowsCount : number , colsCount : number ): T [][] {
240239 const n = this .length ;
241240 if (rowsCount * colsCount !== n ) return [];
242241
243242 // 事前割り当て
244- const result: number [][] = new Array (rowsCount );
243+ const result: T [][] = new Array (rowsCount );
245244 let i = rowsCount ;
246245 while (i -- ) result [i ] = new Array (colsCount );
247246
@@ -270,15 +269,15 @@ Array.prototype.snail = function (rowsCount: number, colsCount: number): number[
270269``` typescript
271270// 前: col % 2 === 0
272271// 後: col & 1
273- // 効果: 約2倍高速(ビット演算は算術演算より効率的 )
272+ // 効果: 算術演算より効率的(環境による )
274273```
275274
276275### 2. 整数除算の最適化
277276
278277``` typescript
279278// 前: Math.floor(i / rowsCount)
280279// 後: (i / rowsCount) | 0
281- // 効果: 約30%高速( ビットORで整数化)
280+ // 効果: ビットORで整数化(環境による )
282281```
283282
284283### 3. モジュロ演算の削減
@@ -345,8 +344,8 @@ const lastRow = rows - 1;
345344
346345 ` ` ` typescript
347346 [1, 2, 3, 4, 5, 6].snail(3, 2);
348- // → [[1,5 ], [2,4 ], [3,6 ]]
349- // 列0: [1,2,3](下), 列1: [6 ,5,4](上)
347+ // → [[1,6 ], [2,5 ], [3,4 ]]
348+ // 列0: [1,2,3](上→ 下), 列1: [4,5,6]を下→上に配置するので[6 ,5,4]の順
350349 ` ` `
351350
3523517. ** 標準ケース(奇数列)**
0 commit comments