File tree Expand file tree Collapse file tree
Algorithm/TwoPointers/leetcode/26. Remove Duplicates from Sorted Array/Sonnet 5 Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1212
1313- ** 制約分析** : LeetCodeの制約は` 1 <= nums.length <= 3 * 10^4 ` 程度であり、O(n)アルゴリズムであれば余裕を持って制限時間内に収まります。O(n log n)やO(n²)を使う必要は全くありません。
1414- ** 最速手法** : ソート済みという性質を使ったTwo-Pointer(二重ポインタ)法がBig-O最適(O(n))かつGo実装最適(追加ヒープアロケーション0回)の両方を満たします。
15- - ** メモリ最小化** : 新しいスライスや` map ` を一切生成せず、` int ` 型のローカル変数1個だけで完結させます 。プリアロケーションも不要(そもそも新しいスライスを作らないため)です。
15+ - ** メモリ最小化** : 新しいスライスや` map ` を一切生成せず、` int ` 型のローカル変数2個( ` slow ` と ` fast ` )だけで完結させます 。プリアロケーションも不要(そもそも新しいスライスを作らないため)です。
1616- ** Go最適化** : 組み込み関数(` len() ` )以外は特に標準ライブラリを使わず、シンプルなforループのみで実装します。
1717
1818### 業務開発視点
2626- ** データ構造選択** : この問題は「順序ありでインデックスアクセスが必要」という性質を持つため、スライス` []int ` がそのまま最適です。` map ` (キー検索)や` channel ` (ゴルーチン間通信)は不要です。
2727- ** 標準ライブラリ活用度** : 実は標準ライブラリの` slices.Compact ` (Go 1.21+で追加)がまさにこの問題と同種の処理を行いますが、今回はアルゴリズムの内部動作を理解する教育的価値を重視し、手動でTwo-Pointerを実装します。
2828- ** 並行処理適性** : 不適。前の要素の処理結果(` slow ` ポインタの位置)が次の判定に依存する逐次処理のため、ゴルーチンによる並列化はできません(並列化すると` slow ` の値が競合し、データ競合(Race Condition)を引き起こします)。
29- - ** エスケープ解析** : ` slow ` と` fast ` はどちらも関数のスコープ内でのみ使われる` int ` 型のローカル変数であり、関数の外に参照が漏れることがないため、コンパイラはこれらをスタックに割り当てます(ヒープへの「逃げ」は発生しません) 。` nums ` 自体は呼び出し元から渡されたスライスヘッダのコピーですが、内部のポインタが指す配列本体はすでにヒープ上(あるいは呼び出し元のスタック)にあり、今回新たにヒープアロケーションが発生することはありません。
29+ - ** エスケープ解析** : ` slow ` と` fast ` はどちらも関数のスコープ内でのみ使われる` int ` 型のローカル変数であり、通常はヒープへエスケープしません。ただし実際の割り当て(スタック配置やレジスタ割り当て)はGoコンパイラのエスケープ解析と最適化に依存します 。` nums ` 自体は呼び出し元から渡されたスライスヘッダのコピーですが、内部のポインタが指す配列本体はすでにヒープ上(あるいは呼び出し元のスタック)にあり、今回新たにヒープアロケーションが発生することはありません。
3030
3131> 📖 ** このセクションで登場した用語**
3232>
You can’t perform that action at this time.
0 commit comments