ハッシュテーブル

キーをハッシュ関数で変換し、O(1) でデータを検索・挿入・削除するデータ構造

データ構造アルゴリズム

ハッシュテーブルとは

ハッシュテーブルは、キーをハッシュ関数で配列のインデックスに変換し、平均 O(1) でデータを検索・挿入・削除するデータ構造である。JavaScript の Map/Object、Python の dict が内部でハッシュテーブルを使用する。

仕組み

キー "alice" → hash("alice") = 3 → 配列[3] に値を格納
キー "bob"   → hash("bob")   = 7 → 配列[7] に値を格納

検索: hash("alice") = 3 → 配列[3] → O(1)

計算量

操作 平均 最悪
検索 O(1) O(n)
挿入 O(1) O(n)
削除 O(1) O(n)

最悪ケースは全キーが同じハッシュ値になる場合 (衝突)。

TypeScript での使用

// Map (ハッシュテーブル)
const users = new Map<string, User>();
users.set('alice', { name: 'Alice', age: 30 });
users.get('alice'); // O(1)
users.has('alice'); // O(1)
users.delete('alice'); // O(1)

// Set (キーのみのハッシュテーブル)
const seen = new Set<string>();
seen.add('item-1');
seen.has('item-1'); // O(1)

衝突の解決

方式 説明
チェイニング 同じインデックスにリンクリストで格納
オープンアドレス 次の空きスロットを探す

配列 vs ハッシュテーブル

// ❌ 配列で検索: O(n)
const users = [{ id: '1', name: 'Alice' }, { id: '2', name: 'Bob' }];
users.find(u => u.id === '1'); // 全要素を走査

// ✅ ハッシュテーブルで検索: O(1)
const userMap = new Map([['1', { name: 'Alice' }], ['2', { name: 'Bob' }]]);
userMap.get('1'); // 即座に取得

実用例: 重複チェック

// O(n) で重複を検出 (ハッシュテーブルを使用)
function hasDuplicate(arr: number[]): boolean {
  const seen = new Set<number>();
  for (const n of arr) {
    if (seen.has(n)) return true;
    seen.add(n);
  }
  return false;
}
// 配列のネストループ O(n²) より高速

基礎から学ぶなら関連書籍が手がかりになる。

関連用語