欢迎访问宙启技术站
智能推送

实现哈希表的存储与查询

发布时间: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。

这只是一个简单的哈希表实现示例,实际中的哈希表可能会有更复杂的处理碰撞的方法,如开放寻址法或二次哈希。