【问题标题】:Is SortedDictionary a red-black tree?SortedDictionary 是红黑树吗?
【发布时间】:2013-02-01 07:44:18
【问题描述】:

我在互联网上看到了一些关于此的引用,但没有官方文档?谁能告诉我在哪里可以得到这方面的信息?

【问题讨论】:

    标签: c# .net binary-tree sorteddictionary


    【解决方案1】:

    文档似乎确实可以保证从 BST 检索 O(log n)。如果他们针对可能的树“平均”报告,那么即使是非平衡实现也可以声称这一点。即使这是一个更坏的情况保证,这与作为 BST 一起并不足以说明它是否被实现为红黑树而不诉诸反编译。它也可以是 AVL、splay 或其他一些平衡变体。

    我抽出了点窥视。在 4.0.0.0 系统组件上。 OrderedDictionary 使用 Treeset,它是 SortedSet 的子类。这看起来很可能是一棵红黑树。然而,它并不是典型的例子,类似于网络上的许多例子,这些例子实现了插入或删除后的平衡。该实现主要是迭代的,并且插入似乎是在向下而不是在插入之后修复颜色(自上而下 - 有几篇关于这种方法的论文)。删除时出现了类似的情况,但没有时间验证它。当然不是直接可比的东西。

    至少,我的猜测是它应该具有类似的运行时特性。当它到达插入/删除点时,它并没有做太多事情,因为一切都是在下降的过程中完成的。

    【讨论】:

      【解决方案2】:

      这不应该被记录下来,因为它是一个实现细节

      例如,SortedDictionary 的实现不止一种:有 Microsoft 的,也有 Mono 的实现。

      事实上,Mono 实现在其当前版本 (2.10.9) 中确实使用了红黑树。当前的 .NET 版本也是如此(您可以通过反编译代码找到它,例如使用 Reflectorildasm.exeMonoDevelop 中的内置 IL 查看器)。

      但是,这可能there are actually more efficient implementations(如B trees)之后会在未来发生变化。

      所以,再说一遍:这些信息没有用,它是一个实现细节,它很有可能会发生变化。

      【讨论】:

      • 这不能回答问题。
      • @GregGraham 怎么样?我清楚地解释了当前(在回答时)实现正在做什么,以及为什么将来不应该依赖这些信息。答案中您还缺少什么?
      【解决方案3】:

      这是来自MSDN页面的官方文档;

      SortedDictionary 泛型类是具有 O(log n) 检索,其中 n 是字典中的元素个数


      SortedDictionery 是红黑树吗?

      ,我对red-black tree不太熟悉,但我只是用dotPeek(免费)反编译了SortedDictionary类,但是红黑树的删除算法和SortedDictionary的Remove () 方法的代码似乎并不相似。所以,我的钱是

      SortedDictionary 始终保持其键排序。它使您可以避免自己对键进行排序。它的查找性能比Dictionary 慢。如果您需要在内存中排序查找表,则它具有优势。

      Dictionary lookup time:       Close to O(1)
      SortedDictionary lookup time: O(log n) 
      

      here 了解更多详情。

      【讨论】:

      • 不确定你反编译了什么,但SortedDictionary在内部只使用TreeSet,这是一个内部类,是的,是根据红黑树实现的。
      • @KonradRudolph 嗯,我反编译了Remove() 方法,它使用了internal virtual bool DoRemove(T item) 方法,但它似乎与red-black tree 没有任何相似之处(这是一个二叉树搜索)@987654325 @。我在这里错过了什么吗?
      • 我目前实际上还没有访问 .NET 实现(我在 Mac 上),但我已经检查了相关资源和转子参考实现(当然是 不是官方的),我几乎可以肯定SortedDictionary确实使用TreeSet这是一棵红黑树。
      • 更重要的是,MSDN 文章实际上保证SortedDictionary 的(当前实现)是二叉搜索树,因此您对DoRemove 方法的评估必须是错误。话虽如此,MSDN 实际上在这一点上是具体的,这很奇怪,因为正如我在回答中所写的那样,使用 binary 搜索树(而不是通用搜索树)的事实是一个实现细节,它一定会改变,所以这个信息在 MSDN 中没有位置。
      • 参考源确认它是一棵红黑树(至少在 4.5.2 中); referencesource.microsoft.com/#System/compmod/system/…
      【解决方案4】:

      您可以对其进行反编译(例如使用 Reflector)...但由于这是一个“实现细节”,我不会依赖它,它可以随时通过任何更新进行更改。

      不确定这样的实现细节有多相关,但如果你真的需要一棵红黑树,那么明确地实现它......其他任何事情都是“技术债务”/“等待发生的灾难”恕我直言。

      【讨论】:

      【解决方案5】:

      来自其 MSDN 页面:

      SortedDictionary 泛型类是具有 O(log n) 检索的二叉搜索树,其中 n 是字典中元素的数量

      【讨论】:

        猜你喜欢
        • 2011-09-18
        • 2010-09-30
        • 2013-07-16
        • 2010-09-06
        • 2019-02-25
        • 2015-04-16
        • 2021-03-02
        • 2011-01-31
        • 2013-07-12
        相关资源
        最近更新 更多