Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"|---------|----------|-----------|------------|---------|-------|-----|\n",
"| 再帰的展開 | O(N) | O(N + D) | 低 | 高 | 高 | N=全要素数、D=深さ。最も直感的 |\n",
"| スタック反復 | O(N) | O(N + D) | 中 | 高 | 中 | スタックオーバーフロー回避可能 |\n",
"| reduce連鎖 | O(N) | O(N + D) | 中 | 中 | 中 | 関数型スタイル、やや複雑 |\n",
"| reduce連鎖 | O(N²) | O(N + D) | 中 | 中 | 中 | 関数型スタイル、やや複雑 |\n",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
"\n",
"## 3. 選択したアルゴリズムと理由\n",
"\n",
Expand Down Expand Up @@ -63,7 +63,7 @@
" * @param arr - 平坦化する多次元配列\n",
" * @param n - 平坦化する深さ(0の場合は平坦化しない)\n",
" * @returns 平坦化された配列\n",
" * @complexity Time: O(N), Space: O(N + D) - N:全要素数, D:深さ\n",
" * @complexity Time: O(N²), Space: O(N + D) - N:全要素数, D:深さ\n",
" */\n",
"var flat = function (arr: MultiDimensionalArray, n: number): MultiDimensionalArray {\n",
" // n = 0 の場合は平坦化不要\n",
Expand Down Expand Up @@ -98,7 +98,7 @@
"\n",
"/**\n",
" * reduceを使った関数型スタイルの実装\n",
" * @complexity Time: O(N), Space: O(N + D)\n",
" * @complexity Time: O(N²), Space: O(N + D)\n",
" */\n",
"var flatReduce = function (arr: MultiDimensionalArray, n: number): MultiDimensionalArray {\n",
" if (n === 0) return arr;\n",
Expand All @@ -123,7 +123,7 @@
"\n",
"/**\n",
" * 反復的なスタックベース実装(大規模データ対応)\n",
" * @complexity Time: O(N), Space: O(N + D)\n",
" * @complexity Time: O(N²), Space: O(N + D)\n",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

スタック反復版の計算量が誤って O(N²) に変更されています。

flatIterative は各要素をスタックから1回ポップし、result.push(item) で O(1) 追加するだけなので、時間計算量は O(N) です。スプレッドや concat() は使用していません。HTML の比較表(スタック反復版: O(N))とも矛盾しています。

📝 修正案
-                " * `@complexity` Time: O(N²), Space: O(N + D)\n",
+                " * `@complexity` Time: O(N), Space: O(N + D)\n",
🤖 Prompt for AI Agents
In `@JavaScript/2625`. Flatten Deeply Nested Array/Claude Code Sonnet 4.5
extended/FlattenDeeplyNestedArray_TS.ipynb at line 126, Update the complexity
annotation for the stack-iteration implementation: change the documented time
complexity in the comment/string that currently reads "Time: O(N²), Space: O(N +
D)" to "Time: O(N), Space: O(N + D)" for the flatIterative implementation, since
flatIterative pops each element once and pushes to result in O(1) per item;
ensure the change references the flatIterative identifier so the doc stays
consistent with the HTML comparison table.

" */\n",
"var flatIterative = function (arr: MultiDimensionalArray, n: number): MultiDimensionalArray {\n",
" const result: MultiDimensionalArray = [];\n",
Expand Down Expand Up @@ -175,7 +175,7 @@
"### パフォーマンス考察\n",
"\n",
"- **再帰呼び出しコスト**: 現代のJSエンジンは末尾再帰最適化を持たないが、制約範囲(depth ≤ 1000)では問題なし\n",
"- **配列操作**: `push(...array)` は一度に複数要素を追加するため、ループより効率的\n",
"- **配列操作**: `push(...array)` はスプレッド展開により内部で配列を反復・割り当てするため、ホットパスでは明示的なループより遅い場合がある(本実装では `push(...flattened)` を要素ごとの `push` に変更することで156ms→80msに改善)\n",
"- **メモリ**: 結果配列は避けられないO(N)。コールスタックはO(D)で十分小さい"
]
},
Expand Down Expand Up @@ -522,12 +522,6 @@
"| スタック初期化 | `[[arr, 0]]` | `arr` の各要素を個別に `[arr[i], 0]` として追加 |\n",
"| depth判定 | `if (depth < n)` のみ | `if (Array.isArray(item) && depth < n)` |\n"
]
},
{
"cell_type": "markdown",
"id": "253e2ebb",
"metadata": {},
"source": []
}
],
"metadata": {
Expand All @@ -545,4 +539,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,40 @@
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css"
integrity="sha384-wFjoQjtV1y5jVHbt0p35Ui8aV8GVpEZkyF99OXWqP/eNJDU93D3Ugxkoyh6Y2I4A"
crossorigin="anonymous"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.css"
integrity="sha384-nUkTNLI8COlMCRJ0FHIdX76If83145OTCLUx4gQyfnO0gGeO/sD9czGEUBxtkcUv"
crossorigin="anonymous"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.css"
integrity="sha384-EUzJ34/1CCeefTGUKLgvA5Z/vYIwi+Jyu8aAaCfFDxfwZ3Xs3OfkkIeegsLRM11e"
crossorigin="anonymous"
/>

<!-- React & ReactDOM -->
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<!-- React & ReactDOM (Production) -->
<script
crossorigin
src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"
crossorigin="anonymous"
src="https://unpkg.com/react@18.3.1/umd/react.production.min.js"
integrity="sha384-DGyLxAyjq0f9SPpVevD6IgztCFlnMF6oW/XQGmfe+IsZ8TqEiDrcHkMLKI6fiB/Z"
></script>
<script
crossorigin="anonymous"
src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"
integrity="sha384-gTGxhz21lVGYNMcdJOyq01Edg0jhn/c22nsx0kyqP0TxaV5WVdsSH1fSDUf5YJj1"
></script>

<!-- Babel Standalone -->
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script
src="https://unpkg.com/@babel/standalone@7.26.9/babel.min.js"
integrity="sha384-pKNXKj7jF9BNMkQyGWg5YLfoPyqBa/gf7wjTSoTGQlwxbZB+sabJuKyOHR6JQvTd"
crossorigin="anonymous"
></script>
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

<style>
* {
Expand Down Expand Up @@ -773,7 +788,7 @@ <h4 class="font-bold text-slate-800 mb-2">4. エッジケース</h4>
stroke-dasharray="8,4"
/>
<rect
x="775"
x="755"
y="450"
width="120"
height="32"
Expand All @@ -783,7 +798,7 @@ <h4 class="font-bold text-slate-800 mb-2">4. エッジケース</h4>
stroke-width="2"
/>
<text
x="835"
x="815"
y="466"
text-anchor="middle"
dominant-baseline="middle"
Expand Down Expand Up @@ -1095,12 +1110,36 @@ <h4 class="font-bold text-orange-900 mb-2">💡 最適化の考察</h4>
</div>

<!-- Prism.js Scripts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-typescript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"
integrity="sha384-06z5D//U/xpvxZHuUz92xBvq3DqBBFi7Up53HRrbV7Jlv7Yvh/MZ7oenfUe9iCEt"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"
integrity="sha384-6QJu8apxMmB9TiPVWzYKF5pRgKcz7snO0/QU+MrWmgBLECQjoa6erxX2VQ5t41Jd"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"
integrity="sha384-jC1G68eGEXJpPwMDNqyIUQsQlcUCdCU+a7GGuoV4TUZvM1gLYTMJUDvqBnxtZLWA"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"
integrity="sha384-ZdEfx8sYX8i4IVXU1tUbqwOp4PBUCCmnpagpiHchnstXkEczkzPfUd9fvBrntM+F"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-typescript.min.js"
integrity="sha384-PeOqKNW/piETaCg8rqKFy+Pm6KEk7e36/5YZE5XO/OaFdO+/Aw3O8qZ9qDPKVUgx"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"
integrity="sha384-D44bgYYKvaiDh4cOGlj1dbSDpSctn2FSUj118HZGmZEShZcO2v//Q5vvhNy206pp"
crossorigin="anonymous"
></script>

<!-- React Component -->
<script type="text/babel">
Expand Down Expand Up @@ -1397,7 +1436,7 @@ <h4 class="font-bold text-orange-900 mb-2">💡 最適化の考察</h4>
</text>

<path
d="M 330 90 L 360 90"
d="M 330 90 L 370 90"
stroke="#10b981"
strokeWidth="3"
fill="none"
Expand Down Expand Up @@ -1513,7 +1552,7 @@ <h4 class="font-bold text-orange-900 mb-2">💡 最適化の考察</h4>
</text>

<path
d="M 330 95 L 360 95"
d="M 330 95 L 370 95"
stroke="#a855f7"
strokeWidth="3"
fill="none"
Expand Down Expand Up @@ -1621,7 +1660,7 @@ <h4 class="font-bold text-orange-900 mb-2">💡 最適化の考察</h4>
</text>

<path
d="M 330 90 L 360 90"
d="M 330 90 L 370 90"
stroke="#10b981"
strokeWidth="3"
fill="none"
Expand Down Expand Up @@ -1737,7 +1776,7 @@ <h4 class="font-bold text-orange-900 mb-2">💡 最適化の考察</h4>
</text>

<path
d="M 330 95 L 360 95"
d="M 330 95 L 370 95"
stroke="#c026d3"
strokeWidth="3"
fill="none"
Expand Down Expand Up @@ -1878,7 +1917,7 @@ <h4 class="font-bold text-orange-900 mb-2">💡 最適化の考察</h4>
return () => {
if (timerRef.current) clearTimeout(timerRef.current);
};
}, [isPlaying, activeStep]);
}, [isPlaying, activeStep, stepsData.length]);

const handlePlay = () => {
if (isPlaying) return;
Expand Down