【问题标题】:Is there a better data structure than dictionary for key existence是否有比字典更好的数据结构来存储密钥
【发布时间】:2014-04-23 11:42:40
【问题描述】:

我经常想优化 .Contains 在集合上的性能。

我总是通过创建Dictionary<TKey,bool> 然后在字典上使用 .ContainsKey 来提供 O(1) .Contains 性能来做到这一点。

然而,我总是不喜欢字典中的值。

有没有比字典更好的数据结构来支持这种我不关心实际值,只关心键的存在的情况?

【问题讨论】:

  • 你的列表排序了吗?如果没有,是否在检查选项之前对列表进行一次排序?
  • @Szymon 我可以对其进行排序,但它仍然比使用字典要慢。我认为二进制搜索是 O(log(n)) 大于 O(1) 用于哈希表查找
  • 正如注释 O(1) 并不意味着它一定会更快,只是对每个项目的访问是恒定的。
  • @kevin 你是绝对正确的(例如小集合)但是对于我的应用程序我通常处理大集合
  • 重复:stackoverflow.com/questions/20482848/… 你甚至可以在询问之前搜索谷歌

标签: c#


【解决方案1】:

HashSet 有一个方法Contains,它是对值的 O(1) 搜索。这应该足够了(假设您的TKey 正确实现了GetHashCode):)

【讨论】:

  • 这更好,正是我想要的。谢谢
  • @Xenolightning:很好的答案。如果我可以添加一个细节:AFAIK,TKey 需要正确实现GetHashCode Equals,而不仅仅是前者。 (GetHashCode 本身仅足以确定两个对象的不等式,但是当两个对象具有相同的哈希码时,这并不总是意味着它们相等。在这种情况下,只能通过Equals 进行完全相等比较会告诉的。)
  • @stakx 是的,你完全正确。 GetHashCode 用于初步查看对象应该在哪里,然后使用Equals 如果它的插槽中存在某些东西。感谢您的澄清。
猜你喜欢
  • 2021-06-01
  • 1970-01-01
  • 2013-05-23
  • 2019-02-06
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2021-03-09
相关资源
最近更新 更多