【问题标题】:C#: Dictionary sorted on key with ~O(1) lookupC#:使用 ~O(1) 查找按键排序的字典
【发布时间】:2011-08-01 10:23:00
【问题描述】:

没有找到答案。

我喜欢 KeyedCollection,因为它保持插入顺序并且有 ~O(1) 键查找时间。

现在我正在寻找一种类似的类型,它将按键而不是插入顺序进行排序。

SortedDictionary 正是这样做的,但实现与我想要的完全相反。插入是 O(1),查找 O(log n)。但是,我想要查找〜O(1)(例如哈希表)并且插入可以是O(log n)(二叉树?)。

这存在吗?不应该很难实现......

谢谢

【问题讨论】:

  • 对于第三方,C5 通用集合库有一个哈希链表,它很接近,除了我必须重新实现插入以维持秩序。而且,散列树会更好。会继续寻找,但这有点令人沮丧。

标签: c# dictionary sorted


【解决方案1】:

.NET BCL 中没有提供您正在寻找的数据结构。也许那里有第 3 方解决方案。

在大多数情况下,O(log n) 就足够了。如果您尝试实现自己的数据结构,您可能会进行微优化。

但是,最快的方法可能是简单地声明一个新类,该类同时具有 Dictionary 和 SortedDictionary 作为私有成员。对于所有读取方法,您将选择更有效的字典来返回值。对于所有 write 方法,您将同时处理内部字典并注意它们保持同步。不过,这可能不是最节省内存的方法。但是如果你想在这里进行优化,你就必须重新实现哈希表的大部分功能。

【讨论】:

  • 如果没有实现,我不想从头开始,最后一种方法似乎是一个很好的性能改进。但是,删除仍然是 log(n)。理想情况下,您希望 Dictionary 也指向 SortedDictionary 的树成员以进行快速删除。但是,这会以更长的查找为代价,因为您必须遵循两个参考。至于这是否是微优化,这肯定取决于手头的问题吗?我认为很多人无论如何都不会考虑为微优化问题选择合适的数据结构。
【解决方案2】:

我认为 OrderedBag 可能是您想要的:

Frequent inserts into sorted collection

【讨论】:

  • OrderedBag 实际上具有更差的性能和开销,因为它可以包含多个具有相同值的键。不过,从同一个线程来看,OrderedSet 似乎是答案。据我所知到目前为止。谢谢!
  • 编辑 - OrderedSet 没有键查找,所以很遗憾它不起作用。
  • 排序列表?我没有进一步研究这个,但因为你显然已经阅读了其余部分...... :)
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 2011-06-17
  • 2011-04-24
  • 1970-01-01
  • 2015-10-10
  • 2012-07-30
  • 1970-01-01
相关资源
最近更新 更多