【发布时间】:2011-02-01 01:09:08
【问题描述】:
dict 究竟是如何实现的,它具有对冲突的线性时间查找?我会假设它是作为由列表支持的哈希表实现的。我认为对于各种操作,更好的实现是 O(log(n)),而是使用树来支持表。幕后是否发生了一些神奇的事情来尽可能长时间地保持持续的时间查找?
顺便说一句,我的来源是:
http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=python+complexity
【问题讨论】:
-
最坏情况的复杂性并不是唯一值得优化的因素。
-
“我认为对于各种操作来说更好的实现是 O(log(n))”,为什么?你见过这方面的任何基准吗?我的理解是“随机”探测实际上平均来说是最快的,并且导致 O(n) 作为最坏的情况。你在假设什么,你看到了什么测量结果?
-
我认为 Python dicts 使用 32 位密钥,这意味着您需要 2**31 或接近 620000000000000 个密钥才能预期 单个冲突(不包括其实现的对象
__hash__真的很糟糕,但我宁愿将其视为一个错误)。所以碰撞真的没有实际意义,花在优化上的时间是浪费时间。 -
@Jochen,我认为您对哈希函数有不切实际的期望。在用尽桶之前给你一个碰撞是不是真的很糟糕,它实际上很常见。看看你在生日冲突之前可以通过多少人,它肯定不会是 365。你可以拥有完美的哈希函数,但前提是你了解数据提前。给定一个通用的散列函数,如果你知道算法,你可以只用两个条目创建一个冲突。
-
@Jochen:当然有碰撞;哈希表通常没有 2^32 个桶。 (另外,2^31 只是 2147483648,而不是 620000000000000——而且你完全忘记了生日问题。)
标签: python