哈希表(Hash Table)是一种通过哈希函数将键(Key)映射到表中一个位置以便快速访问记录的数据结构。
下面是一个复杂的哈希表实现,它使用链表法解决冲突,并且具有动态扩容的功能。这个实现使用Python语言:
class HashNode:
def __init__(self, key, value):
self.key = key
self.value = value
self.next = None
class HashTable:
def __init__(self, size=10):
self.size = size
self.capacity = size * 2
self.table = [None] * self.size
def hash_function(self, key):
return hash(key) % self.size
def insert(self, key, value):
key_hash = self.hash_function(key)
head = self.table[key_hash]
node = head
while node:
if node.key == key:
node.value = value
return
node = node.next
new_node = HashNode(key, value)
new_node.next = head
self.table[key_hash] = new_node
self._resize()
def get(self, key):
key_hash = self.hash_function(key)
head = self.table[key_hash]
node = head
while node:
if node.key == key:
return node.value
node = node.next
return None
def remove(self, key):
key_hash = self.hash_function(key)
head = self.table[key_hash]
prev = None
node = head
while node:
if node.key == key:
if prev:
prev.next = node.next
else:
self.table[key_hash] = node.next
return node.value
prev = node
node = node.next
return None
def _resize(self):
old_table = self.table
self.size = self.capacity
self.capacity *= 2
self.table = [None] * self.size
for head in old_table:
while head:
self.insert(head.key, head.value)
head = head.next
# 使用示例
hash_table = HashTable(10) # 创建一个初始大小为10的哈希表
hash_table.insert("name", "Alice")
hash_table.insert("age", 30)
hash_table.insert("country", "Wonderland")
print(hash_table.get("name")) # 输出 Alice
print(hash_table.get("age")) # 输出 30
print(hash_table.get("country")) # 输出 Wonderland
hash_table.remove("name")
print(hash_table.get("name")) # 输出 None
在这个实现例子中解决哈希冲突和扩容的问题
链表法解决冲突:每个哈希表的槽位现在是一个链表的头节点,当发生冲突时,新的节点会被添加到链表的头部。
动态扩容:当插入元素时,如果哈希表的负载因子(当前元素数量与容量的比值)超过1,哈希表会进行扩容。扩容过程中,旧的哈希表会被复制到一个新的更大的哈希表中。
哈希函数:使用Python内置的 hash() 函数,并取模得到索引位置。
插入、获取和删除操作:这些操作现在需要遍历链表来处理冲突。