C#数据结构与SortedDictionary()和node.Next()功能?

时间:2011-05-09 08:01:48

标签: c# data-structures sorteddictionary

如何构建/获取具有以下功能的数据结构:

  • 存储(键,值)节点,键实现IComparable。
  • 快速(日志N)插入和检索。
  • 快速(log N)方法,用于从任何节点检索下一个较高/下一个较低节点。 [例子:如果 插入的关键值是(7,cat),(4,dog),(12,鸵鸟),(13,金鱼)然后如果keyVal引用(7,cat),keyVal.Next()应该返回一个引用( 12,鸵鸟)]。

使用来自任意键的枚举器的解决方案当然也足够了。请注意,标准的SortedDictionary功能是不够的,因为只能返回整个集合上的枚举器,这使得查找keyVal.next时最不需要N次操作。

自我实现的平衡二叉搜索树(红黑树)是否可以安装node.next()功能?这样做有什么好的参考?任何编码时间较少的解决方案?

2 个答案:

答案 0 :(得分:0)

我曾经有类似的要求,但找不到合适的东西。所以我实现了一个AVL树。这里提出了一些建议来考虑性能:

  1. 不要使用递归来遍历树(插入,更新,删除,下一步)。最好使用堆栈数组来存储平衡操作所需的根。
  2. 不存储父节点。所有操作都将从根节点开始,然后向下走。如果仔细实施,则不需要父母。
  3. 为了找到现有节点的Next()节点,通常首先调用Find()。由此产生的堆栈应该重用于Next()而不是。
  4. 通过遵循这些规则,我能够实现AVL树。即使对于非常大的数据集,它也非常有效。我愿意分享,但它需要一些修改,因为它不存储值(非常容易)并且不依赖于IComparable但是依赖于固定键类型的int。

答案 1 :(得分:0)

PowerCollections中的OrderedDictionary提供了“从密钥开始或在密钥开始之前获取迭代器”功能,该功能需要O(log N)时间来返回第一个值。这样就可以非常快速地扫描5000个项目集中间的1,000个项目(使用SortedDictionary需要猜测从开始或结束开始,这两个项目都是同样糟糕的选择,并且需要迭代器约2500万件)。 OrderedDictionary可以只迭代1,000个项目。

OrderedDictionary中存在一个问题,因为它在使用32位进程迭代5000万个项目集时使用yield会导致O(n ^ 2)性能和内存不足情况。有一个非常简单的解决方法,我稍后会记录。