当前位置: 首页 > article >正文

具体的散列表实现示例

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


http://www.kler.cn/a/297858.html

相关文章:

  • leetcode hot100_part6_矩阵
  • 【Python】Win32print:批量文件打印
  • 直播相关01-录制麦克风声音,QT上 .pro 将 linux,mac和windows上配置为三种可以共享, 在.pro文件中 message 的作用
  • IDEA中无法使用 Subversion 命令行客户端 svn Subversion 可执行文件的路径可能是错误的
  • Flutter的升级和降级步骤
  • Apple发布iPhone16和Apple Intelligence
  • 专注LabVIEW 做好一件事
  • 软件测试 - 性能测试 (实战 - 基于场景的性能测试-博客系统)(⼯具 - JMeter )
  • 基于IndexDB+md-editor-v3实现的简单的文章书写小系统
  • HarmonyOS学习(九)——窗口管理
  • Embedding 模型简介
  • Knife4j:打造优雅的SpringBoot API文档
  • FPGA随记——8B/10B编码
  • [数据集][图像分类]嘴巴张开闭合分类数据集6397长2类别
  • 【STM32】SPI通信-软件与硬件读写SPI
  • golang学习笔记13——golang的错误处理深度剖析
  • 公共场所团队管理-手机端源码讲解--SAAS本地化及未来之窗行业应用跨平台架构
  • 猜测、实现 B 站在看人数
  • 如何通过Autoscaler实现Kubernetes的伸缩?
  • 【Kubernetes知识点问答题】监控与升级 / ETCD 备份与恢复