Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有SortedDictionary()和node.Next()功能的C#数据结构?_C#_Data Structures_Sorteddictionary - Fatal编程技术网

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

具有SortedDictionary()和node.Next()功能的C#数据结构?,c#,data-structures,sorteddictionary,C#,Data Structures,Sorteddictionary,如何构造/获取具有以下功能的数据结构: 存储(键、值)节点,键实现IComparable 快速(logn)插入和检索 从任何节点检索下一个较高/下一个较低节点的快速(logn)方法。[示例:如果 插入的键值为(7,猫),(4,狗),(12,鸵鸟),(13,金鱼),如果keyVal引用(7,猫),则keyVal.Next()应返回对(12,鸵鸟)的引用 当然,使用来自任意键的枚举数的解决方案也就足够了。请注意,标准的SortedDictionary功能是不够的,因为只能返回整个集合上的枚举数,

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

  • 存储(键、值)节点,键实现IComparable
  • 快速(logn)插入和检索
  • 从任何节点检索下一个较高/下一个较低节点的快速(logn)方法。[示例:如果 插入的键值为(7,猫),(4,狗),(12,鸵鸟),(13,金鱼),如果keyVal引用(7,猫),则keyVal.Next()应返回对(12,鸵鸟)的引用
当然,使用来自任意键的枚举数的解决方案也就足够了。请注意,标准的SortedDictionary功能是不够的,因为只能返回整个集合上的枚举数,这使得查找keyVal.next最坏需要N个操作


自我实现的平衡二叉搜索树(红黑树)是否可以安装node.next()功能?做这件事有什么好的参考资料吗?有没有更少的编码耗时的解决方案?

我曾经有过类似的需求,但无法找到合适的解决方案。所以我实现了一个AVL树。以下是一些考虑到性能的建议:

  • 不要使用递归遍历树(插入、更新、删除、下一步)。最好使用堆栈数组存储到平衡操作所需的根
  • 不要存储父节点。所有操作都将从根节点开始,并进一步向下执行。如果认真执行,就不需要父母
  • 为了查找现有节点的下一个()节点,通常首先调用find()。由此生成的堆栈应重新用于Next(),而不是
    通过遵循这些规则,我能够实现AVL树。即使对于非常大的数据集,它也能非常有效地工作。我很愿意与大家分享,但它需要一些修改,因为它不存储值(非常简单),也不依赖于IComparable,而是基于int的固定键类型。

    PowerCollections中的OrderedDictionary提供了一个“get iterator starting at or before key”函数,返回第一个值需要O(logn)时间。这使得扫描5000万项集合中间的1000项(使用SortedDictionary需要在开始或结束时进行猜测,两者都是同样糟糕的选择,需要大约2500万项迭代器)的速度非常快。OrderedDictionary只需迭代1000项就可以实现这一点


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

    关于同一主题还有许多其他问题,但没有一个能解决我的问题problem@willem我不明白。如果反复使用.MoveNext()从当前节点查找下一个节点(只需在整个集合上迭代,直到找到当前节点,然后再迭代一个),则仅使用一个枚举数并执行
    .MoveNext()
    .MoveNext()
    ,…?@Oscar是不够的,这将非常耗时。我想要下一个节点fast@willem隐马尔可夫模型。。这取决于如何在
    SortedDictionary
    类上实现该功能。它应该是
    O(n)
    以排序的顺序生成所有元素,所以每次执行
    .MoveNext()
    时都是
    O(1)
    @willem我只花了不到两天的时间就完成了,尽管我记得几天前我不得不修复一个bug,因为它不是100%平衡的。一本很好的参考书是算法介绍书。它很好地解释了每个旋转。我建议你实施它。然后,您可以将其设置为通用,并为每个具有类似需求的项目提供一份副本:)如果您愿意共享:太好了!修改似乎很容易。无论如何,谢谢你的建议。