ふくふくHukuhuku Inc.
EP.08CS Basics対象: 中2以上 10分公開: 2026-05-10

データ構造の基礎:配列・リスト・ハッシュ・ツリー

適切なデータ構造を選ぶだけで、プログラムは 1000 倍速くなることがある。配列・連結リスト・ハッシュテーブル・ツリーの 4 つを、Python での実装と計算量で見比べる。

#データ構造#ハッシュ#ツリー#情報I
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

「同じ問題でも、データ構造を変えるだけで 1000 倍速くなる」 ことが普通にあります。本記事では基本 4 種類を、Python での書き方と計算量で見比べます。

1. 4 大データ構造

構造アクセス検索挿入削除メモリ
配列 (動的)O(1)O(n)O(1) 末尾O(n)連続
連結リストO(n)O(n)O(1) 先頭O(1)ばらつき
ハッシュテーブルO(1)O(1)O(1)領域大きめ
二分探索木 (平衡)O(log n)O(log n)O(log n)中間

2. 配列とリスト (Python)

list と deque の比較
Python
from collections import dequeimport time
# Python の list (動的配列) - 末尾追加は速い、先頭追加は遅いlst = []for i in range(100000):    lst.append(i)         # O(1) 平均    lst.insert(0, i)      # O(n)、遅い!
# deque (両端キュー) - 両端の追加削除が O(1)dq = deque()for i in range(100000):    dq.append(i)          # O(1)    dq.appendleft(i)      # O(1) 速い!

3. ハッシュテーブル (Python の dict / set)

dict は内部ハッシュテーブル
Python
# 1 万件の検索を比較import time
# リストで線形検索 - 遅いdata_list = list(range(10000))start = time.time()for q in [9999, 5000, 0]:    print(q in data_list)  # O(n)print(f'list: {time.time()-start:.4f}s')
# dict (ハッシュ) - 一瞬data_set = set(range(10000))start = time.time()for q in [9999, 5000, 0]:    print(q in data_set)   # O(1)print(f'set:  {time.time()-start:.4f}s')

4. ツリーと再帰

二分探索木 (基本構造)
Python
class Node:    def __init__(self, value):        self.value = value        self.left = None        self.right = None
class BST:    def __init__(self):        self.root = None
    def insert(self, value):        if not self.root:            self.root = Node(value)            return        self._insert(self.root, value)
    def _insert(self, node, value):        if value < node.value:            if node.left: self._insert(node.left, value)            else: node.left = Node(value)        else:            if node.right: self._insert(node.right, value)            else: node.right = Node(value)
# 使い方tree = BST()for v in [5, 3, 8, 1, 9, 4]:    tree.insert(v)# 平衡している場合は検索 O(log n)

5. データ構造の選び方

要件推奨Python での書き方
順番に処理listfor x in lst:
末尾に追加listlst.append()
先頭に追加dequedq.appendleft()
特定キーで検索dict / setx in d / d[k]
重複を除くsetset(lst)
最小/最大の取出しheapqheapq.heappush/pop
順序付きキー検索ソート済み list + bisect / SortedDictbisect.bisect_left

6. 次の話

EP.09 では アルゴリズム へ。データ構造を活かして、探索・ソート・最短経路を効率良く解く方法を見ます。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp