做了个简单的LeetCode两数之和的题目,需要用到哈希表,不过不知道python中怎么搞哈希表。结果GPT给了个简单的答案,就是python的字典。突然发现用了这么多年python,对于python基础的字典却是一点也不了解……遂从数据结构的角度,重新看待一下python的字典。
之前在Python数据结构与算法-基础介绍+顺序表 – 红茶小馆中,我们大体介绍了Python中列表在数据底层大概是分离式技术实现的动态顺序表。而字典,则是按照如下内存结构进行存储的。
Python 的 字典 (dict) 是 CPython 里最重要的数据结构之一,底层其实是哈希表 (hash table),而且是做过很多优化的哈希表。
一个“哈希表索引数组”:存放哈希值映射的槽位(slot),用来快速查找。
一个“元素数组”:存放真正的键值对(key, value)。
这两个表都是顺序表。
哈希表索引数组,里面每个位置叫一个“槽位(slot)”。存的内容是一些 索引信息:比如 key 的哈希值、探测偏移量,以及指向元素表的索引。本质上就是一个定长数组,里面要么是空槽,要么是一个指向元素数组的“引用”。
元素数组也是一个顺序表。存放的是真正的键值对 (key, value),而且在 Python3.6+,它会保持插入顺序。这个表在逻辑上像是“链表”,但实现上是顺序表,内存连续,查找效率高。
平均情况:查找、插入、删除操作都是 O(1)。如果哈希函数冲突特别严重,会退化到 O(n),但 Python 的哈希函数设计得还不错,而且表会自动扩容,基本很少见。
GPT讲的有点复杂……看的有点懵,不过大概是这样,反正知道字典两个表组成,查找、插入、删除操作都是O(1)就行了。