拉链法实现字典

 

字典:

也叫散列表,最大的特点是通过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查到的时间,可见下图

 

posted @   escapist  阅读(555)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示