哈希查找算法
哈希查找算法又叫散列表查找算法,是一种基于哈希表的查找方法。哈希表一般用来存储和查询键值对。哈希表的查询时间复杂度为 O(1),是一种非常高效的数据结构。
原理
哈希查找算法的原理是通过哈希函数将数据的关键字映射为一个固定大小的数组下标,然后将数据存储在对应的数组位置上。查询时也是通过哈希函数计算出数据的下标,然后在数组中查找数据。由于哈希函数的映射过程是非常快速的,因此哈希查找算法的查询时间复杂度可以达到 O(1)。
实现
实现哈希查找算法需要以下几个步骤:
-
哈希函数的设计:需要根据实际的数据集合设计合适的哈希函数来映射数据的关键字到数组下标。哈希函数的设计需要考虑到哈希冲突的情况,即不同的关键字映射到相同的数组下标的情况,需要采取一定的解决冲突的策略。常见的哈希函数包括除法取余法、乘法哈希法、MD5等。
-
哈希表的实现:通过数组和链表实现哈希表,数组的每一个元素存储链表的头指针,链表中存储具有相同哈希值的元素。当哈希表中存储的元素过多时,可以使用扩容等方法优化哈希表的性能。
-
针对哈希冲突的解决策略:常见的解决哈希冲突的方法包括链表法和开放地址法。链表法是指在哈希表每个数组元素中存储一个链表,将哈希值相同的元素存储在链表中。开放地址法是指在哈希表中,当哈希值相同时,将元素存储在在哈希表的其他位置上,也可以通过跳跃式的方式寻找空位置存储元素。常见的开放地址法包括线性探测法、二次探测法等。
示例
以下是一个使用哈希查找算法的示例:
# 使用哈希表实现电话簿的查找
class TelephoneBook:
def __init__(self):
self.hash_table = {}
def add(self, name, number):
hash_val = hash(name) % 1001
if hash_val not in self.hash_table:
self.hash_table[hash_val] = []
self.hash_table[hash_val].append((name, number))
def lookup(self, name):
hash_val = hash(name) % 1001
if hash_val in self.hash_table:
for entry in self.hash_table[hash_val]:
if entry[0] == name:
return entry[1]
return None
# 创建电话簿示例
book = TelephoneBook()
# 添加一些记录
book.add("Alice", "123-4567")
book.add("Bob", "234-5678")
book.add("Charlie", "345-6789")
# 查找记录
number = book.lookup("Bob")
print(number) # "234-5678"
以上示例演示了如何使用哈希表实现电话簿的查找。通过 hash()
函数将姓名转化为哈希值,再将数据存储在哈希表中,实现了 O(1) 的查找效率。
以下是另一个示例,演示了如何使用哈希查找算法来实现对一个文本文件中单词出现次数的统计:
# 统计单词出现次数的示例
import re
# 哈希查找算法实现的字典类
class HashDict:
def __init__(self):
self.hash_table = [None] * 1001
def __setitem__(self, key, value):
hash_val = hash(key) % 1001
if self.hash_table[hash_val] is None:
self.hash_table[hash_val] = []
self.hash_table[hash_val].append((key, value))
def __getitem__(self, key):
hash_val = hash(key) % 1001
if self.hash_table[hash_val] is not None:
for entry in self.hash_table[hash_val]:
if entry[0] == key:
return entry[1]
return 0
# 统计单词出现次数
counts = HashDict()
with open("test.txt", "r") as f:
for line in f:
words = re.findall(r'\w+', line)
for word in words:
word = word.lower()
counts[word] += 1
# 打印结果
for key in sorted(counts.hash_table):
if key is not None:
print(key, counts[key])
以上示例演示了如何使用哈希查找算法统计一个文本文件中单词的出现次数。对于所有单词,通过 HashDict 类来实现将单词和出现次数存储在哈希表中,最后遍历哈希表输出所有单词的出现次数。