python - Python 内部 hash() 函数的复杂性

标签 python hash big-o

我知道哈希表查找的平均情况是 O(1),但这是否包括计算给定输入的哈希值本身所花费的时间?我试过在谷歌上寻找答案,阅读了所有需要的文档,但在 Python 中找不到内部 hash() 函数的实现。一些网站表示计算哈希值需要一定的时间,有些网站表示它是 O(k),其中 k 是输入的长度。如果你能帮我找到正确答案,我会很高兴。提前致谢:)

最佳答案

这完全取决于被散列的类型。以下是 CPython 2.7.13 中的一些简单测试,这不是唯一的选择:

>>> pprint.pprint([(i, timeit.timeit('hash(n)', setup='n="a"*{}'.format(6400*i), number=1)) for i in range(16)])
[(0, 1.9073486328125e-06),
 (1, 1.6927719116210938e-05),
 (2, 3.314018249511719e-05),
 (3, 4.887580871582031e-05),
 (4, 6.4849853515625e-05),
 (5, 8.106231689453125e-05),
 (6, 9.679794311523438e-05),
 (7, 0.00011301040649414062),
 (8, 0.00012993812561035156),
 (9, 0.00014495849609375),
 (10, 0.00016188621520996094),
 (11, 0.0001780986785888672),
 (12, 0.00019288063049316406),
 (13, 0.0002090930938720703),
 (14, 0.000225067138671875),
 (15, 0.00024199485778808594)]
>>> pprint.pprint([(i, timeit.timeit('hash(n)', setup='n="a"*{}'.format(6400*i))) for i in range(16)])
[(0, 0.09920382499694824),
 (1, 0.09032988548278809),
 (2, 0.09069585800170898),
 (3, 0.09006309509277344),
 (4, 0.09059309959411621),
 (5, 0.09033513069152832),
 (6, 0.09037399291992188),
 (7, 0.09031510353088379),
 (8, 0.09110498428344727),
 (9, 0.09074902534484863),
 (10, 0.0909719467163086),
 (11, 0.09081602096557617),
 (12, 0.09112405776977539),
 (13, 0.09091711044311523),
 (14, 0.09103798866271973),
 (15, 0.09085893630981445)]

请注意,对新创建的字符串进行哈希处理的复杂度为 O(n),但每个字符串都在缓存其哈希值,因此在重复时它会分摊到常数时间(number=1000000timeit 的默认值)。

>>> pprint.pprint([(i, timeit.timeit('hash(n)', setup='n=2**{}'.format(64*i))) for i in range(16)])
[(0, 0.09280180931091309),
 (1, 0.09100484848022461),
 (2, 0.09413909912109375),
 (3, 0.09609699249267578),
 (4, 0.10647201538085938),
 (5, 0.1146399974822998),
 (6, 0.12569880485534668),
 (7, 0.1291029453277588),
 (8, 0.13350296020507812),
 (9, 0.1369338035583496),
 (10, 0.14037799835205078),
 (11, 0.14420413970947266),
 (12, 0.1485278606414795),
 (13, 0.15162205696105957),
 (14, 0.15520405769348145),
 (15, 0.15993809700012207)]

long 也是 O(n),其中 n 是数字的宽度,因此是数量级的对数。粒度为digit。 ,通常 2**30 专门用于直接用作较小整数的散列。

其他对象将有自己的行为,例如 tuples将粗略地总结其内容的哈希时间。

关于python - Python 内部 hash() 函数的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51338089/

相关文章:

java - 如何在数组列表中存储字符串数组列表的哈希码

Python UnicodeEncodeError,但我已将参数编码为 UTF-8

ruby - 修改默认哈希值

c++ - 解决这个问题的时间复杂度是多少?

找不到这段 C 代码的时间复杂度?

python - 如何在python中移动具有复杂文件名的文件

python - 包含任意用户定义的函数的最佳方式?

python - 如何将 boost::none 传递给 Python Quantlib

python - 在 DJANGO 中加载管理员和我的页面的 CSS 时出现问题

java - for 循环的时间复杂度为 O(c^k) - 指数时间复杂度