RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

データ構造と用途について

概要

配列・ハッシュ・ツリーなど、様々なデータ構造があります。
用途によって向き不向きがあるので、まとめておきます。

データ構造

配列(Array)

データが単純に一列に並んだ構造です。
algo-logic.info

環状バッファ(Ring Buffer)

最後と最初をつなげた配列です。
ufcpp.net

ギャップバッファ(Gap Buffer)

編集した箇所にギャップ(すき間)を作るように要素を移動する配列です。
takty.stxst.com

連結リスト(Linked List)

要素から前や次の要素へのリンクがある構造です。
www.codereading.com

二分探索木(Binary Search Tree)

要素が2つのリンクを持ち、左側が自分より小さく、右側が自分より大きくなるように維持した構造です。平衡を保つ機構として、AVL木・赤黒木が優秀です。
ufcpp.net

二分ヒープ(Binary Heap)

要素が2つのリンクを持ち、両方が自分より小さい値になるように維持した構造です。
www.codereading.com

ハッシュテーブル(Hash Table)

要素を要約した数値(ハッシュ)を計算し、その数値に応じた場所に要素を入れる構造です。
qiita.com

用途と向き不向き

値を一つずつ最後まで列挙する

◎ どれでも良いですが、配列・リングバッファ・ギャップバッファが特に速いです。

末尾に追加

◎ 配列・リングバッファ・ギャップバッファが速いですが、どれでも良いです。

先頭に挿入

△ 配列の先頭に挿入すると、全ての要素を後ろに1つずつずらすことになり、時間が掛かります。
→ 代わりに、環状バッファを検討してください。

同じ個所に何度も挿入

△ 配列・環状バッファの途中に挿入すると、以降の要素を後ろに1つずつずらすことになり、時間が掛かります。
→ 代わりにギャップバッファを検討してください。

格納された値で検索

◎ ハッシュテーブルが速いです。
◎ 二分探索木も良いです。
△ 配列・リングバッファ・ギャップバッファは、先頭から調べていくことになるので時間が掛かります。
→ 並べ替えてソート済の配列にしてしまえば、検索は二分探索木と同じ速さになります。

格納された値の最大値(または最小値)を調べる

◎ ヒープでは、木の根が必ず最大値(または最小値)になるため、最速で処理が可能です。
◎ 二分探索木も良いです。
△ 配列・リングバッファ・ギャップバッファは、先頭から調べていくことになるので、時間がかかります。
→ 並べ替えてソート済みの配列にすれば、最大値も最小値も最速で取得できます。(並べ替えるのに時間が掛かりますが……)

まとめ

用途に合わせてデータ構造を選べば、速度は爆上がりです。