【发布时间】:2011-05-09 08:01:47
【问题描述】:
如何构造/获取具有以下功能的数据结构:
- 存储(键,值)节点,键实现IComparable。
- 快速 (log N) 插入和检索。
- 从任何节点检索下一个更高/下一个更低节点的快速 (log N) 方法。 [示例:如果 插入的键值为 (7,cat), (4,dog),(12,ostrich), (13,goldfish) 那么如果 keyVal 引用 (7,cat), keyVal.Next() 应该返回对 ( 12、鸵鸟)]。
使用来自任意键的枚举器的解决方案当然也足够了。请注意,标准的 SortedDictionary 功能是不够的,因为只能返回整个集合的枚举数,这使得查找 keyVal.next 最多需要 N 次操作。
是否可以为自行实现的平衡二叉搜索树(红黑树)配备 node.next() 功能?这样做有什么好的参考吗?有没有更省时的编码解决方案?
【问题讨论】:
-
同一主题还有很多其他问题,但没有一个能解决我的问题
-
@willem 我不明白。只有一个枚举器并执行
.MoveNext()、.MoveNext()、...还不够吗? -
@Oscar 如果您反复使用 .MoveNext() 从某个当前节点查找下一个节点(只需遍历整个集合,直到找到当前节点,然后再迭代一次),这将非常耗时。我想要下一个节点快
-
@willem hmm.. 这取决于如何在
SortedDictionary类上实现该功能。它应该是O(n)以排序顺序产生所有元素,所以每次你做.MoveNext()时都会是O(1) -
@willem 我在不超过两天的时间内完成了它,尽管我记得我必须在几天前修复一个错误,因为它不是 100% 平衡的。 Introductions to Algorithms 一书是一个很好的参考。它很好地解释了每次旋转。我建议你实施它。然后,您可以使其通用并为每个具有类似要求的项目提供一份副本:)
标签: c# data-structures sorteddictionary