データをどう並べて保管するかで、出し入れの速さや使い道が変わります。スタック・キュー・リスト・木・ハッシュ表・グラフという代表的なデータ構造を、身近なたとえで直感をつかみながら、ITパスポート試験で問われるポイントごとに整理します。
スタックって、なんだか積み上げるって意味ですかぁ?
いい勘ね。
スタックは、机に本を積み上げていくイメージよ。
新しい本は一番上に置くし、取るときも一番上から。
だから後から入れたものが先に出る、LIFO(後入れ先出し)になるの。
あー、洗ったお皿を重ねていくのと一緒じゃん。
一番上のやつから使うもんね。
その例えがぴったりです。
操作の名前も覚えておきましょう。
データを積むのがプッシュ、一番上を取り出すのがポップです。
じゃあ反対に、先に入れた人から出ていくのもあるんですかぁ?
あるわよ。
それがキュー。
スーパーのレジに並ぶ行列を思い浮かべて。
先に並んだ人から順に会計するでしょう?
だから先入れ先出し、FIFOよ。
スタックが『積み上げ』で、キューが『行列』ね。
マジでわかりやすい。
対比で押さえると忘れません。
キューの操作は、末尾に入れるのがエンキュー、先頭から取り出すのがデキューです。
ところでさ、こいつらって実際どこで使われてんの?
スタックは『元に戻す(Undo)』や、関数を呼び出して元の場所へ戻る処理に使われるわ。
直前の状態に戻りたいときは、後入れ先出しが便利なのよ。
一方キューは、印刷の順番待ちや受け付けた順に処理する仕事に向いているの。
ちゃんと役割が違うんですねぇ。
あの、データを一列につないでおくのは何ていうんですかぁ?
それがリストです。
番号で一気に取り出せる配列と、各データが次の場所を指し合う連結リストがあります。
配列は読み出しが速く、連結リストは途中への挿入や削除が得意、という違いがありますね。
なるほど、電車でいうと配列は座席番号で一発で座れて、連結リストは『次はあの車両』って手をつないでる感じか。
ふふ、うまい例えね。
さて次は枝分かれする構造、木構造(ツリー)よ。
一番上の起点をルート(根)、枝分かれの先で子を持たない末端を葉(リーフ)と呼ぶの。
木なのに上が根っこで下が葉っぱって、なんだか逆さまですぅ。
面白いところですよね。
木構造は階層関係を表すのが得意で、パソコンのフォルダ構成や組織図、Webページの構造などが代表例です。
木の中でも試験で頻出なのが、各ノードの子が最大2つの二分木。
さらに『左の子<自分<右の子』という大小ルールで並べたものが二分探索木(BST)よ。
そのルールがあると何が嬉しいの?
探す値が自分より小さければ左、大きければ右、と一歩ごとに候補が半分に絞れるんです。
だから検索が速く、平均でO(log n)になります。
10万件でも約17回の比較で見つかる計算ですね。
10万件で17回だけ!?
すっごく少ないですぅ。
もっと速いのもあるのよ。
ハッシュ表は、ハッシュ関数で鍵を保管場所の番号に直接変換するの。
だから探す手間がほとんどなく、平均O(1)で取り出せるわ。
番号さえ計算すれば一発で取り出せるってこと?
それマジで速いじゃん。
そうです。
ただし別の鍵が同じ番号に化けることがあり、これを衝突と呼びます。
衝突が増えると速さは落ちるので、O(1)はあくまで平均の話、という点は補足しておきますね。
あ、そういえば『グラフ』ってのも聞いたことあるんだけど、あれも仲間?
仲間です。
グラフは、点と線でつながり方そのものを表す構造で、路線図やSNSの友達関係、地図の経路などに使われます。
関係を押さえておくと混乱しないわ。
じつは木はグラフの特別な形で、ぐるっと一周する経路、つまり閉路を持たないものなの。
グラフはもっと自由で、閉路があったり、矢印のような向きを持つこともあるのよ。
木はグラフの仲間で、ルールが厳しいバージョンなんですねぇ。
そのとおり。
最後に整理するわね。
出し入れの順番ならスタック(後入れ先出し)とキュー(先入れ先出し)、一列に並べるならリスト、階層なら木、速さ重視ならBSTやハッシュ表、つながり全体を見るならグラフ。
用途と速さをセットで覚えれば、もう迷わないわ。
確認クイズ
後に入れたデータほど先に取り出される、後入れ先出し(LIFO)の特徴を持つデータ構造はどれか。
- キュー
- スタック
- 二分探索木
- ハッシュ表
こたえを見る
正解: 2. スタック
正解はスタック。積み上げた本のように、最後に入れたものから取り出すLIFO(後入れ先出し)の構造です。キューは先に入れたものから取り出すFIFO(先入れ先出し)で逆の性質。二分探索木は大小規則で並べて高速検索する木構造、ハッシュ表は鍵を保管場所に変換して高速検索する構造で、いずれも出し入れの順番を決める構造ではありません。