データ構造 (スタック・キュー・木)

スタック(LIFO)・キュー(FIFO)・リスト・木・二分探索木・ハッシュ表・グラフの特徴と用途を、身近なたとえと計算量でやさしく整理。

編集・検証: ITパスポートスタディ編集部 公式情報: IPA ITパスポート試験公式ページ 制作・検証方針

データをどう並べて保管するかで、出し入れの速さや使い道が変わります。スタック・キュー・リスト・木・ハッシュ表・グラフという代表的なデータ構造を、身近なたとえで直感をつかみながら、ITパスポート試験で問われるポイントごとに整理します。

小夜川 ほのか(普段) 小夜川 ほのか

スタックって、なんだか積み上げるって意味ですかぁ?

紫垣 こはる 先生(笑顔) 紫垣 こはる 先生

いい勘ね。
スタックは、机に本を積み上げていくイメージよ。
新しい本は一番上に置くし、取るときも一番上から。
だから後から入れたものが先に出る、LIFO(後入れ先出し)になるの。

星見 めい(笑顔) 星見 めい

あー、洗ったお皿を重ねていくのと一緒じゃん。
一番上のやつから使うもんね。

蜂谷 まこと(普段) 蜂谷 まこと

その例えがぴったりです。
操作の名前も覚えておきましょう。
データを積むのがプッシュ、一番上を取り出すのがポップです。

小夜川 ほのか(普段) 小夜川 ほのか

じゃあ反対に、先に入れた人から出ていくのもあるんですかぁ?

紫垣 こはる 先生(笑顔) 紫垣 こはる 先生

あるわよ。
それがキュー。
スーパーのレジに並ぶ行列を思い浮かべて。
先に並んだ人から順に会計するでしょう?
だから先入れ先出し、FIFOよ。

星見 めい(笑い) 星見 めい

スタックが『積み上げ』で、キューが『行列』ね。
マジでわかりやすい。

蜂谷 まこと(普段) 蜂谷 まこと

対比で押さえると忘れません。
キューの操作は、末尾に入れるのがエンキュー、先頭から取り出すのがデキューです。

星見 めい(普段) 星見 めい

ところでさ、こいつらって実際どこで使われてんの?

紫垣 こはる 先生(普段) 紫垣 こはる 先生

スタックは『元に戻す(Undo)』や、関数を呼び出して元の場所へ戻る処理に使われるわ。
直前の状態に戻りたいときは、後入れ先出しが便利なのよ。
一方キューは、印刷の順番待ちや受け付けた順に処理する仕事に向いているの。

小夜川 ほのか(普段) 小夜川 ほのか

ちゃんと役割が違うんですねぇ。
あの、データを一列につないでおくのは何ていうんですかぁ?

蜂谷 まこと(普段) 蜂谷 まこと

それがリストです。
番号で一気に取り出せる配列と、各データが次の場所を指し合う連結リストがあります。
配列は読み出しが速く、連結リストは途中への挿入や削除が得意、という違いがありますね。

星見 めい(笑顔) 星見 めい

なるほど、電車でいうと配列は座席番号で一発で座れて、連結リストは『次はあの車両』って手をつないでる感じか。

紫垣 こはる 先生(普段) 紫垣 こはる 先生

ふふ、うまい例えね。
さて次は枝分かれする構造、木構造(ツリー)よ。
一番上の起点をルート(根)、枝分かれの先で子を持たない末端を葉(リーフ)と呼ぶの。

小夜川 ほのか(普段) 小夜川 ほのか

木なのに上が根っこで下が葉っぱって、なんだか逆さまですぅ。

蜂谷 まこと(普段) 蜂谷 まこと

面白いところですよね。
木構造は階層関係を表すのが得意で、パソコンのフォルダ構成や組織図、Webページの構造などが代表例です。

紫垣 こはる 先生(普段) 紫垣 こはる 先生

木の中でも試験で頻出なのが、各ノードの子が最大2つの二分木。
さらに『左の子<自分<右の子』という大小ルールで並べたものが二分探索木(BST)よ。

星見 めい(普段) 星見 めい

そのルールがあると何が嬉しいの?

蜂谷 まこと(笑顔) 蜂谷 まこと

探す値が自分より小さければ左、大きければ右、と一歩ごとに候補が半分に絞れるんです。
だから検索が速く、平均でO(log n)になります。
10万件でも約17回の比較で見つかる計算ですね。

小夜川 ほのか(びっくり) 小夜川 ほのか

10万件で17回だけ!?
すっごく少ないですぅ。

紫垣 こはる 先生(普段) 紫垣 こはる 先生

もっと速いのもあるのよ。
ハッシュ表は、ハッシュ関数で鍵を保管場所の番号に直接変換するの。
だから探す手間がほとんどなく、平均O(1)で取り出せるわ。

星見 めい(びっくり) 星見 めい

番号さえ計算すれば一発で取り出せるってこと?
それマジで速いじゃん。

蜂谷 まこと(普段) 蜂谷 まこと

そうです。
ただし別の鍵が同じ番号に化けることがあり、これを衝突と呼びます。
衝突が増えると速さは落ちるので、O(1)はあくまで平均の話、という点は補足しておきますね。

星見 めい(普段) 星見 めい

あ、そういえば『グラフ』ってのも聞いたことあるんだけど、あれも仲間?

蜂谷 まこと(普段) 蜂谷 まこと

仲間です。
グラフは、点と線でつながり方そのものを表す構造で、路線図やSNSの友達関係、地図の経路などに使われます。

紫垣 こはる 先生(笑顔) 紫垣 こはる 先生

関係を押さえておくと混乱しないわ。
じつは木はグラフの特別な形で、ぐるっと一周する経路、つまり閉路を持たないものなの。
グラフはもっと自由で、閉路があったり、矢印のような向きを持つこともあるのよ。

小夜川 ほのか(笑顔) 小夜川 ほのか

木はグラフの仲間で、ルールが厳しいバージョンなんですねぇ。

紫垣 こはる 先生(笑顔) 紫垣 こはる 先生

そのとおり。
最後に整理するわね。
出し入れの順番ならスタック(後入れ先出し)とキュー(先入れ先出し)、一列に並べるならリスト、階層なら木、速さ重視ならBSTやハッシュ表、つながり全体を見るならグラフ。
用途と速さをセットで覚えれば、もう迷わないわ。

確認クイズ

後に入れたデータほど先に取り出される、後入れ先出し(LIFO)の特徴を持つデータ構造はどれか。

  1. キュー
  2. スタック
  3. 二分探索木
  4. ハッシュ表
こたえを見る

正解: 2. スタック

正解はスタック。積み上げた本のように、最後に入れたものから取り出すLIFO(後入れ先出し)の構造です。キューは先に入れたものから取り出すFIFO(先入れ先出し)で逆の性質。二分探索木は大小規則で並べて高速検索する木構造、ハッシュ表は鍵を保管場所に変換して高速検索する構造で、いずれも出し入れの順番を決める構造ではありません。

小夜川ほのかが美術室で水彩画を楽しむ様子

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。