【问题标题】:What is the time complexity of python dict has_key() methodpython dict has_key() 方法的时间复杂度是多少
【发布时间】:2017-12-26 11:48:52
【问题描述】:

python dicthas_key()方法的时间复杂度是多少 是不是 O(1) 就像 dict 中的键一样。

【问题讨论】:

  • 是的,O(1),但我只会使用key in my_dict
  • 最坏的情况是 O(n)。实际上已经有黑客精心构建了输入来关闭服务器。但这仅适用于非常罕见的情况。平均情况是 O(1)
  • has_key() 在 Python 3.x.big-o is O(1) 中被移除
  • 使用 'if key in dct' 或 'if key not in dct'

标签: python python-2.7 dictionary time-complexity


【解决方案1】:

简答: 最坏情况O(n)。但是平均情况的时间复杂度是O(1)。然而,最坏的情况非常很少

当您进行查找时,首先对键进行双重散列(一次根据键的类型,一次根据字典)。根据该结果,我们知道必须在哪个存储桶中搜索,然后开始搜索。

然而,散列冲突是可能发生的:在这种情况下,多个键在同一个桶中,所以我们必须在多个键中进行搜索。最坏的情况是所有的键都在 same 桶中,因此我们回退到线性搜索。

但是非常很少发生哈希冲突(具有大量键)。通常可以安全地假设 - 无论字典的大小如何 - 同一存储桶中的键数都是固定的。

O(n)这一事实对安全性产生了一些有趣的影响。假设您有一个在字典中存储和检索数据的服务器。然后,响应时间当然会随着这样的查找而扩展。现在,黑客可以设计输入,使所有密钥都放在 same 存储桶中。结果查找速度会变慢,最终服务器将不再在合理的时间内响应。这就是为什么 Python 有一个标志 -R for hash randomization。这将更改每次运行的散列函数,从而使黑客更难设计此类输入。

【讨论】:

  • 所以,has_key的内部实现还是运行时复杂度,dict中的key和dict[key]是一样的
  • @PMat 是的,准确地说。哈希,然后检查存储桶。查看 [this][youtube.com/watch?v=C4Kc8xzcA68] 视频,了解 Python dicts 的内部结构。它已经过时了,但基本思路还是一样的。
  • @PMat:确实。仅当您执行d[key] 时,您才会返回与键关联的值,因为存储桶包含具有键和值的元组。
猜你喜欢
  • 2018-01-18
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
相关资源
最近更新 更多