【アルゴリズム解説】「アルゴリズム探求」簡単解説‼【③ハッシュテーブルとは】

こんにちはヤク学長です。
データサイエンティスト兼ファーマシストで、アルゴリズムやBI開発を行っています。

本記事の目的は、「アルゴリズムの基本を知る」ことを目的としています。

【本記事のもくじ】

下記の方法で、簡単に概要を抑えることができます。

  • 1.ハッシュテーブルとは

それでは、上から順番に見ていきます。
なお、本上記の方法を順番に抑えれば成果が出ます。

記事の内容は「転載 & 引用OK」問題ありません。

1.ハッシュテーブルとは

ハッシュテーブルとは

ハッシュテーブルは、キーと値をペアで格納するデータ構造の一種で、データの検索を高速に行うことができます。ハッシュテーブルは、ハッシュ関数を使って、キーを配列のインデックスに変換し、そのインデックスに値を格納することで、データの検索を行います。

ハッシュ関数は、キーを入力として受け取り、一定のルールに基づいて配列のインデックスに変換します。このとき、ハッシュ関数は、同じキーに対しては常に同じインデックスを返すように設計されています。ただし、異なるキーに対して同じインデックスを返す「ハッシュ衝突」という現象が起こることがあります。この場合、別の配列要素に値を格納する方法が必要になります。

一般的に、ハッシュテーブルは以下のような操作を行うことができます。

  • 挿入(Insert)

新しいキーと値のペアをハッシュテーブルに挿入します。このとき、キーがすでに存在する場合は、値を更新するか、エラーを返します。

  • 削除(Delete)

指定されたキーを持つ値をハッシュテーブルから削除します。

  • 検索(Search)

指定されたキーを持つ値をハッシュテーブルから検索し、返します。もしキーが存在しない場合は、エラーを返します。

ハッシュテーブルは、ハッシュ関数の性能やハッシュ衝突の処理方法によって、検索の速度が大きく変わることがあります。ハッシュ関数の設計や、衝突を解決するアルゴリズムの最適化が、ハッシュテーブルの性能を向上させる上で重要な要素となります。

Pythonでは、ハッシュテーブルを辞書(dictionary)として実装しています。以下は、辞書を使ったハッシュテーブルの例です。

# 空の辞書を作成
hash_table = {}

# キーと値のペアを追加
hash_table["apple"] = 100
hash_table["banana"] = 200
hash_table["cherry"] = 300

# キーを指定して値を検索
print(hash_table["apple"]) # 100

# キーが存在しない場合は KeyError が発生する
#print(hash_table["durian"]) # KeyError: 'durian'

# キーが存在しない場合にはデフォルト値を返す get() メソッドを使うこともできる
print(hash_table.get("durian", "not found")) # "not found"

# キーが存在するかどうかを調べる
print("apple" in hash_table) # True
print("durian" in hash_table) # False

# キーと値のペアを削除
del hash_table["cherry"]

このように、辞書を使って簡単にハッシュテーブルを実装できます。Pythonの辞書は、ハッシュテーブルの性能を最大限に引き出すように最適化されており、高速で効率的に動作することが知られています。

リスト内から足し合わせて同じ値になるペアを見つける

リスト内から足し合わせて同じ値になるペアを見つける場合、ハッシュテーブルを使うことで効率的に処理できます。

具体的には、リスト内の要素を順に処理して、その要素をハッシュテーブルに追加しながら、ハッシュテーブルに対して残りの要素から成るペアを検索することで、足し合わせて同じ値になるペアを見つけることができます。

以下は、このアルゴリズムをPythonで実装した例です。

def find_pairs(lst, target_sum):
seen = set() # すでに出現した要素を記録するための集合
pairs = [] # 見つかったペアを保存するためのリスト

for num in lst:
complement = target_sum - num # 目標値から現在の値を引いた補数
if complement in seen: # 補数がすでに集合に存在する場合はペアを見つけたとみなす
pairs.append((num, complement))
seen.add(num) # 現在の値を集合に追加

return pairs

この関数は、リスト lst と目標値 target_sum を引数として受け取り、リスト内から足し合わせて同じ値になるペアを見つけて、見つかったペアをタプルのリストとして返します。

この関数では、集合 seen を使って、すでに出現した要素を記録しています。リスト内の要素を順に処理して、現在の要素の補数が集合に存在するかどうかを調べ、存在する場合は見つかったペアとして pairs リストに追加します。また、現在の要素を集合に追加して、次の要素の処理に備えます。

このアルゴリズムの実行時間は、ハッシュテーブルに要素を追加するときに $O(1)$ の時間がかかるため、リスト内の要素数を $n$ とすると、全体として $O(n)$ の時間がかかります。従って、このアルゴリズムは非常に効率的であり、大規模なデータセットに対しても素早く処理できます。


というわけで、今回は以上です。大変大変お疲れ様でした。
引き続きで、徐々に発信していきます。

コメントや感想を受け付けています。ちょっとした感想でもいいので嬉しいです。

それでは、以上です。

最新情報をチェックしよう!