哈希表设计与实现——链表法
时间: 2023-10-24 18:08:58 浏览: 128
哈希表是一种高效的数据结构,可以用来存储和查找键值对。其中,哈希函数将键映射到一个特定的桶中,每个桶中存储一组键值对。在哈希表中,如果两个键被映射到同一个桶中,就会发生碰撞。为了解决这个问题,可以使用链表法。
链表法是一种解决哈希表碰撞问题的方法。具体来说,对于哈希表中的每个桶,可以使用一个链表来存储所有映射到该桶的键值对。如果发生碰撞,只需要将新的键值对添加到链表的末尾即可。
下面是一个使用链表法实现哈希表的示例代码:
```python
class Node:
def __init__(self, key, value):
self.key = key
self.value = value
self.next = None
class HashTable:
def __init__(self, capacity):
self.capacity = capacity
self.buckets = [None] * capacity
def hash_function(self, key):
return hash(key) % self.capacity
def put(self, key, value):
index = self.hash_function(key)
node = self.buckets[index]
while node:
if node.key == key:
node.value = value
return
node = node.next
new_node = Node(key, value)
new_node.next = self.buckets[index]
self.buckets[index] = new_node
def get(self, key):
index = self.hash_function(key)
node = self.buckets[index]
while node:
if node.key == key:
return node.value
node = node.next
return None
def remove(self, key):
index = self.hash_function(key)
node = self.buckets[index]
prev = None
while node:
if node.key == key:
if prev:
prev.next = node.next
else:
self.buckets[index] = node.next
return
prev = node
node = node.next
```
在这个示例中,我们定义了一个Node类来表示哈希表中的每个节点,每个节点包含一个键、一个值和一个指向下一个节点的指针。我们还定义了一个HashTable类来实现哈希表,其中包含一个桶数组和一些基本的操作方法,如put、get和remove。
在put方法中,我们首先使用哈希函数计算出键的索引,然后遍历桶中的链表,查找该键是否已经存在于哈希表中。如果找到了该键,我们只需要更新其对应的值即可。否则,我们创建一个新的节点,并将其添加到链表的开头。
在get方法中,我们同样使用哈希函数计算出键的索引,然后遍历桶中的链表,查找该键的值。如果找到了该键,我们返回其对应的值。否则,返回None。
在remove方法中,我们首先使用哈希函数计算出键的索引,然后遍历桶中的链表,查找该键。如果找到了该键,我们将其从链表中删除即可。
总的来说,链表法是一种简单且常用的哈希表解决碰撞问题的方法。
阅读全文