<一覧に戻る

ハッシュ関数とハッシュテーブルの基本

ハッシュ関数とハッシュテーブルは、データの迅速な検索や保存を実現するための非常に重要なデータ構造とアルゴリズムです。この教材では、ハッシュ関数とハッシュテーブルの基本的な概念を理解し、Pythonでの実装を通じてその動作を学びます。

ハッシュ関数とは

ハッシュ関数は、入力データ(通常は文字列や数値)を固定長のハッシュ値に変換する関数です。このハッシュ値は、元のデータの特徴を反映しており、異なるデータが同じハッシュ値を生成する可能性(ハッシュ衝突)があります。

ハッシュ関数の特性

  • 一方向性: 入力からハッシュ値を計算するのは容易ですが、ハッシュ値から元の入力を逆算することは非常に困難です。
  • 固定長出力: 入力の長さに関わらず、出力は固定のサイズです。
  • 衝突耐性: 異なる入力が同じハッシュ値を生成する可能性があるが、良いハッシュ関数はその確率を低く保つ。

ハッシュテーブルとは

ハッシュテーブルは、データを効率的に格納・検索するためのデータ構造です。データをキーと値のペアとして格納し、キーを使って値を迅速に取得します。ハッシュテーブルは、内部的に配列を使用し、ハッシュ関数を使ってキーをインデックスに変換します。

ハッシュテーブルの基本的な操作

  1. 挿入: 新しいキーと値のペアをハッシュテーブルに追加します。
  2. 検索: 指定したキーに関連付けられた値を取得します。
  3. 削除: 指定したキーとその関連値をハッシュテーブルから削除します。

Pythonによるハッシュテーブルの実装

以下は、ハッシュ関数とハッシュテーブルの基本的な実装の例です。

class HashTable:
    def __init__(self, size=10):
        self.size = size
        self.table = [None] * size

    def _hash(self, key):
        return hash(key) % self.size

    def insert(self, key, value):
        index = self._hash(key)
        self.table[index] = value

    def search(self, key):
        index = self._hash(key)
        return self.table[index]

    def delete(self, key):
        index = self._hash(key)
        self.table[index] = None


# 実装をテスト
if __name__ == "__main__":
    hash_table = HashTable()

    # データの挿入
    hash_table.insert("apple", 1)
    hash_table.insert("banana", 2)
    hash_table.insert("orange", 3)

    # データの検索
    print("apple:", hash_table.search("apple"))  # 出力: apple: 1
    print("banana:", hash_table.search("banana"))  # 出力: banana: 2

    # データの削除
    hash_table.delete("apple")
    print("apple:", hash_table.search("apple"))  # 出力: apple: None

コード解説

  1. クラス定義: HashTableクラスを定義し、コンストラクタでハッシュテーブルのサイズを設定します。self.tableは、指定したサイズの空のリストを作成します。

  2. ハッシュ関数: _hashメソッドを定義し、Pythonの組み込み関数hash()を使用してキーをハッシュ化し、テーブルのサイズで剰余を取ることでインデックスを計算します。

  3. 挿入メソッド: insertメソッドは、指定されたキーのハッシュ値を計算し、そのインデックスに値を格納します。

  4. 検索メソッド: searchメソッドは、指定されたキーのハッシュ値を計算し、そのインデックスから値を取得します。

  5. 削除メソッド: deleteメソッドは、指定されたキーのハッシュ値を計算し、そのインデックスの値をNoneに設定します。

  6. テスト: メインブロックでハッシュテーブルを作成し、いくつかのデータを挿入、検索、削除を行います。

このように、ハッシュ関数とハッシュテーブルを使用することで、効率的なデータの格納と検索が可能になります。次回は、ハッシュ衝突の解決法に焦点を当てていきます。

出力結果: