具体的散列表实现示例

117 阅读2分钟

例中,我们将使用链地址法(拉链法)来处理冲突,并使用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 方法分别用于插入、查找和删除键值对。