【问题标题】:Is it faster to search in a dictionary than in a list?在字典中搜索比在列表中搜索更快吗?
【发布时间】:2015-10-24 23:13:18
【问题描述】:

我是 Python 新手,我注意到有两种方法可以在字典中搜索键:

d={1: 'a', 2: 'b',...}
if 1 in d: ... 

if 1 in d.keys(): 

我认为它们是相同的,但由于我必须在包含 100 000 个元素的字典中进行搜索,因此我发现第二种方法需要太多时间。我已经寻找并读到这是因为d.keys() 返回一个列表,然后搜索元素的时间复杂度为 O(n),但在字典中搜索的复杂度为 O(1)。这是真的吗?

【问题讨论】:

  • 更多信息请见the wiki entry on this
  • @TigerhawkT3 感谢您提供的信息 :) 我不知道!
  • 没问题 - 我刚刚用 Google 搜索了“python 字典列表 o(n)”。由于您自己看到了真实世界的结果,并且您提到您已经在网上进行了研究,所以除了“是的,您确实得出了正确的结论”之外,我不确定您在这里寻找什么。而你做到了。 :)
  • 请注意,在 Python 3 中 dict.keys() 返回一个视图对象,它还支持 O(1) 查找。
  • @TigerhawkT3 不,我想要一个可靠的信息来源,你给了它

标签: python list search dictionary time-complexity


【解决方案1】:

是的,这是真的。大多数字典都是作为哈希映射实现的。所以你有 O(1) 的访问权限。这比列表的 O(n) 快得多。

为什么只需要 O(1)? 因为哈希映射对每个键进行哈希处理,并将其放入生成的存储桶中。如果您搜索一个键,它将散列您的输入并查看是否有值。如果有一个值,它会返回它,否则你会被告知没有条目。快速浏览一下...

如果你对这样的东西感兴趣,你应该看看 cormen 的“算法简介”

【讨论】:

  • 接近 O(1)。当发生关键碰撞时,它会略微发散。
  • 没错,但据我所知,这将由一个常数值表示。 O(1*c) 也是正确的,但你可以删除常量值,所以它应该是 O(1)
  • 我不认为这是一个常数。它取决于密钥空间和项目数。但对手头的问题并不重要。
  • 但是哈希映射的想法是使用具有低碰撞预测的哈希算法......所以你它应该是一个非常小的值......但是它不是恒定的,但是我想忽略它没有问题...
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多