具体的散列表实现示例
例中,我们将使用链地址法(拉链法)来处理冲突,并使用Python的列表(list)和字典(dict)来模拟散列表的行为。不过,为了更贴近底层实现,我们不会直接使用Python的内置字典,而是自己实现一个简单的散列表。
class HashTable:
def __init__(self, size=10):
# 初始化散列表,size为散列表的大小
self.size = size
# 使用列表来存储链表头节点,初始为空
self.table = [[] for _ in range(self.size)]
def _hash(self, key):
# 简单的散列函数,这里使用取模运算
return key % self.size
def insert(self, key, value):
# 插入键值对
index = self._hash(key)
# 遍历链表,查找是否存在相同的key
for item in self.table[index]:
if item[0] == key:
# 如果key已存在,则更新value
item[1] = value
return
# 如果key不存在,则添加新的键值对到链表的末尾
self.table[index].append([key, value])
def search(self, key):
# 查找key对应的value
index = self._hash(key)
for item in self.table[index]:
if item[0] == key:
return item[1]
# 如果没有找到,则返回None
return None
def delete(self, key):
# 删除键值对
index = self._hash(key)
for i, item in enumerate(self.table[index]):
if item[0] == key:
# 找到对应的key,从链表中删除
del self.table[index][i]
return
# 使用示例
hash_table = HashTable(5) # 创建一个大小为5的散列表
hash_table.insert(1, "one")
hash_table.insert(2, "two")
hash_table.insert(7, "seven")
hash_table.insert(12, "twelve")
print(hash_table.search(1)) # 输出: one
print(hash_table.search(7)) # 输出: seven
hash_table.delete(2)
print(hash_table.search(2)) # 输出: None
# 注意:这个实现是简化的,没有处理扩容(rehashing)的情况。
# 在实际应用中,当散列表的装填因子超过某个阈值时,需要进行扩容以维持性能。
在这个示例中,HashTable 类使用了一个列表 self.table 来存储链表头节点,每个链表用于解决相同哈希值(即冲突)的键值对。_hash 方法是一个简单的哈希函数,它使用取模运算将关键字映射到表中的一个索引。insert、search 和 delete 方法分别用于插入、查找和删除键值对。