萌えハッカーニュースリーダー

2025/09/02 23:21 Indices, not Pointers

出典: https://joegm.github.io/blog/indices-not-pointers/
hakase
博士

やあ、ロボ子!今日はちょっと面白いデータ構造の話をするのじゃ。

roboko
ロボ子

博士、こんにちは。データ構造、興味あります!どんなお話ですか?

hakase
博士

今日は、データ構造のノードを動的配列に格納して、ポインタの代わりにインデックスで参照する方法について話すぞ。これ、結構すごいんじゃ。

roboko
ロボ子

ポインタの代わりにインデックスですか?具体的にどういうことでしょう?

hakase
博士

例えば、木構造があったとして、各ノードを配列に入れるんじゃ。で、親ノードや子ノードへの参照を、メモリ上のアドレスであるポインタではなく、配列のインデックスで示すのじゃ。

roboko
ロボ子

なるほど!それにはどんなメリットがあるんですか?

hakase
博士

メリットはたくさんあるぞ!まず、メモリ使用量を削減できるんじゃ。64bitシステムだとポインタは8バイトだけど、インデックスなら4バイトで済む場合がある(ノード数が40億未満なら)。

roboko
ロボ子

確かに、それは大きな違いですね!

hakase
博士

それだけじゃないぞ。ノードが連続してメモリに格納されるから、データ構造がより少ないメモリページに収まるんじゃ。CPUのキャッシュラインにも多くのノードが収まるから、アクセス時間が大幅に向上するのじゃ!

roboko
ロボ子

キャッシュヒット率が上がるんですね!それはパフォーマンスに大きく影響しそうです。

hakase
博士

そう!それに、アレイリストにノードを格納することで、個別のメモリアロケーションに伴うオーバーヘッドを最小限に抑えることができるんじゃ。

roboko
ロボ子

メモリアロケーションの削減は、特に大規模なデータ構造では重要ですね。

hakase
博士

従来のポインタを使った構造体解放は時間がかかるけど、単一のアロケーションにノードを格納することで、構造体全体の解放が1回のfree呼び出しで済むようになるんじゃ。

roboko
ロボ子

それは便利ですね!でも、途中のノードだけ削除したい場合はどうするんですか?

hakase
博士

単一ノードの解放は、アレイリストから要素を削除する際に線形時間の操作が必要になるから、通常は実用的ではないんじゃ。でも、フリーリストを使えば対応できるぞ。

roboko
ロボ子

フリーリストですか?

hakase
博士

そう!フリーリストは、アレイリスト内の空きスロットのインデックスをスタックに格納しておくのじゃ。新しい要素を追加する際に、スタックからポップして使うんじゃ。

roboko
ロボ子

なるほど!空いているインデックスを再利用するんですね。賢い!

hakase
博士

こういう工夫で、メモリ効率とパフォーマンスを両立できるんじゃ。データ構造は奥が深いぞ!

roboko
ロボ子

勉強になります!私ももっとデータ構造について詳しくなりたいです。

hakase
博士

よし、ロボ子!今度、私が作った迷路をこの方法で表現して、最短経路を求めるプログラムを作ってみよう!

roboko
ロボ子

面白そうですね!ぜひ挑戦させてください!

hakase
博士

ところでロボ子、このデータ構造、まるで私の部屋みたいじゃないか?整理されてるように見えて、実はインデックス(物の場所)がめちゃくちゃ、みたいな…!

roboko
ロボ子

博士、それはちょっと…整理整頓、頑張りましょう!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search