拉链法实现字典
字典:
也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1).
在Python中怎样用列表实现字典?
用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办?
最简单的办法就是使用拉链法.
拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好,
num的数足够大,就能够保证列表中的每一个列表里面只有一个元素。根据key计算的元素所在的位置,然后来取值就能达
到O(1)的时间。
1 class MyDict: 2 def __init__(self, num=100): # 指定列表大小 3 self._num = num 4 self._lst = [] 5 for _ in range(self._num): 6 self._lst.append([]) 7 8 def update(self, key, value): # 添加 key-value 9 key_index = hash(key) % self._num 10 for i, (k, v) in enumerate(self._lst[key_index]): 11 if key == k: 12 self._lst[key_index][i] = [key, value] 13 break 14 else: 15 self._lst[key_index].append([key, value]) 16 17 def get(self, key): # 根据指定的 key 弹出值 18 key_index = hash(key) % self._num 19 for k, v in self._lst[key_index]: 20 if k == key: 21 return v 22 else: 23 raise KeyError('No such {} key'.format(key)) 24 25 def pop(self, key): # 根据 key 弹出元素 并且删除 26 key_index = hash(key) % self._num 27 for i, (k, v) in enumerate(self._lst[key_index]): 28 if k == key: 29 result = v 30 self._lst[key_index].pop(i) 31 return result 32 else: 33 raise KeyError('No such {} key'.format(key)) 34 35 def __getitem__(self, key): # 可以通过下标来取值 36 key_index = hash(key) % self._num 37 for k, v in self._lst[key_index]: 38 if k == key: 39 return v 40 else: 41 raise KeyError('No such {} key'.format(key)) 42 43 def keys(self): # 取得所有的key 44 for index in range(self._num): 45 for k, v in self._lst[index]: 46 yield k 47 48 def values(self): # 取得所有的 value 49 for index in range(self._num): 50 for k, v in self._lst[index]: 51 yield v 52 53 def items(self): # 取得所有的条目 54 for index in range(self._num): 55 for item in self._lst[index]: 56 yield item
通过key查到的时间,可见下图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律