实现哈希表的存储与查询
发布时间:2023-07-03 14:43:30
哈希表是一种常见的数据结构,用于存储键值对。它通过哈希函数将键映射到一个固定大小的数组中,从而实现快速的插入和查询操作。在本文中,我们将实现一个简单的哈希表,包括存储和查询功能。
首先,我们需要定义一个哈希函数,它将键转换为数组的索引。一个简单的哈希函数可以是将键的ASCII码相加,然后取余数组大小。例如,如果数组大小为10,则哈希函数可以是key % 10。
接下来,我们需要定义一个数组来存储键值对。对于每个数组位置,我们可以使用一个链表来处理碰撞(即多个键映射到同一个索引的情况)。
下面是一个简单的哈希表的实现示例:
class Node:
def __init__(self, key, value):
self.key = key
self.value = value
self.next = None
class HashTable:
def __init__(self, size):
self.size = size
self.table = [None] * size
def _hash_function(self, key):
return sum(ord(c) for c in key) % self.size
def insert(self, key, value):
index = self._hash_function(key)
node = Node(key, value)
if self.table[index] is None:
self.table[index] = node
else:
curr = self.table[index]
while curr.next:
curr = curr.next
curr.next = node
def find(self, key):
index = self._hash_function(key)
curr = self.table[index]
while curr:
if curr.key == key:
return curr.value
curr = curr.next
return None
在上面的示例代码中,我们定义了一个Node类来表示链表中的节点。每个节点包含一个键、一个值和一个指向下一个节点的指针。HashTable类中的_hash_function方法用于计算键的哈希值,并基于哈希值返回存储位置的索引。insert方法用于将键值对插入哈希表中,如果存在碰撞,则将节点附加到链表的末尾。find方法用于根据给定的键查找对应的值。
以下是一个使用示例:
hash_table = HashTable(10)
hash_table.insert("apple", 3)
hash_table.insert("banana", 4)
hash_table.insert("cherry", 5)
print(hash_table.find("apple")) # 输出 3
print(hash_table.find("banana")) # 输出 4
print(hash_table.find("cherry")) # 输出 5
print(hash_table.find("durian")) # 输出 None
在上面的示例中,我们创建了一个大小为10的哈希表,并将三个键值对插入其中。然后,我们使用find方法查询每个键的值,并打印结果。对于不存在的键(如"durian"),find方法返回None。
这只是一个简单的哈希表实现示例,实际中的哈希表可能会有更复杂的处理碰撞的方法,如开放寻址法或二次哈希。
