【问题标题】:BigO for dictionary method 'get(key)'字典方法'get(key)'的BigO
【发布时间】:2013-05-31 08:31:29
【问题描述】:

有人知道 python 的字典 'get(key)' 方法的 O(?) 是多少吗?

我已经使用 cProfile 模块对其进行了测试,并在字典中获得了 100、1000、10000、100000、1000000、100000000 条记录的相同时间结果。

是不是说python的字典对任意键都提供了O(1)的访问时间?

【问题讨论】:

标签: python python-2.7


【解决方案1】:

答案是 - 是的,因为 Python dicts 使用哈希来存储键。哈希表访问其密钥的平均时间复杂度为O(1) - 在此处阅读更多信息http://en.wikipedia.org/wiki/Hash_table

密钥检索的最坏情况是O(n),其中ndictionary 中的密钥数。 (@Michael Butscher)。

【讨论】:

  • 除了具有大量哈希冲突的病理情况。最坏的情况是 O(n),其中 n 是键的数量
  • 最坏的情况是非常非常非常难以达到。
  • 感谢@MichaelButscher!直到你提到这一点,我才意识到这是可能的,因为彩虹表是如此成功,人们不会怀疑它们会有瓶颈。
  • @MorganWilde 是的,您可能还需要实现 __eq__ 以进行正确检查(以防散列冲突)
  • 这不是摊销时间复杂度。摊销复杂度意味着:对于字典上的任何 n 个操作序列,total 时间就好像每个操作花费了 O(1) 时间——尽管单个操作可能仍需要更多时间。一个例子是追加到一个过度分配的数组,其中追加。正如wiki.python.org/moin/TimeComplexity 所说,正确的术语是average
【解决方案2】:

是的,对于任何键,它实际上都是 O(1)。

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多