跳转至

Python 字典的时间复杂度是多少?

Python 字典的核心操作(查找、插入、删除)平均时间复杂度是 O(1),最坏会降到 O(n)。


🗂️ 平均 O(1):因为它是“哈希直通车”

字典底层是一张哈希表。

你给它一个键,它立刻算出哈希值,然后映射到表里的一个固定位置——就像你拿着门牌号直接走到那扇门前,不需要从街头一间间找。

键 "name" → hash("name") → 表索引 3 → 直接拿到值

这个“计算索引再跳转”的过程,跟字典里有多少数据无关,所以是常数时间。


📉 最坏 O(n):当“一条街只有一个门牌号”

如果不同的键算出了相同的索引(哈希冲突),就需要处理冲突。

Python 用的是开放寻址法:如果这个位置有人了,就往旁边找空位。

正常情况冲突很少,但如果哈希函数质量太差,或者字典被恶意构造,会导致大量键堆在一起,变成线性探测,查找就退化成遍历数组了。

键都堆在索引 5 → 找键 X 要从 5 开始一个个往后比 → O(n)

这就是为什么 Python 从 3.3 开始,默认启用了哈希随机化,每次启动解释器都会换一个随机种子,让攻击者很难制造出大量冲突,把最坏情况锁死。


⚖️ 为什么平均还是 O(1)

Python 会自动维护负载因子(已用槽位 / 总槽位)。

当负载因子超过约 2/3 时,就会自动扩容(分配更大的哈希表,重新哈希所有键),让冲突概率保持极低。

虽然扩容本身需要 O(n) 的时间,但均摊到每次插入上仍然是 O(1)。


📊 一张表速览

查看内嵌表格