Python 字典的时间复杂度是多少?
Python 字典的核心操作(查找、插入、删除)平均时间复杂度是 O(1),最坏会降到 O(n)。
🗂️ 平均 O(1):因为它是“哈希直通车”¶
字典底层是一张哈希表。
你给它一个键,它立刻算出哈希值,然后映射到表里的一个固定位置——就像你拿着门牌号直接走到那扇门前,不需要从街头一间间找。
这个“计算索引再跳转”的过程,跟字典里有多少数据无关,所以是常数时间。
📉 最坏 O(n):当“一条街只有一个门牌号”¶
如果不同的键算出了相同的索引(哈希冲突),就需要处理冲突。
Python 用的是开放寻址法:如果这个位置有人了,就往旁边找空位。
正常情况冲突很少,但如果哈希函数质量太差,或者字典被恶意构造,会导致大量键堆在一起,变成线性探测,查找就退化成遍历数组了。
这就是为什么 Python 从 3.3 开始,默认启用了哈希随机化,每次启动解释器都会换一个随机种子,让攻击者很难制造出大量冲突,把最坏情况锁死。
⚖️ 为什么平均还是 O(1)¶
Python 会自动维护负载因子(已用槽位 / 总槽位)。
当负载因子超过约 2/3 时,就会自动扩容(分配更大的哈希表,重新哈希所有键),让冲突概率保持极低。
虽然扩容本身需要 O(n) 的时间,但均摊到每次插入上仍然是 O(1)。