C# SortedDictionary是红黑树吗?

C# SortedDictionary是红黑树吗?,c#,.net,binary-tree,sorteddictionary,C#,.net,Binary Tree,Sorteddictionary,我在网上看到了一些关于这方面的引述,但没有官方文件?有人能告诉我在哪里可以得到关于这个的信息吗?从它的MSDN页面: SortedDictionary泛型类是一个具有O(logn)检索的二叉搜索树,其中n是字典中的元素数 您可以反编译它(例如使用Reflector)。。。但由于这是一个“实现细节”,我不会依赖它,它可以随时随任何更新而更改 不确定这样一个实现细节有多重要,但如果您真的需要一个红黑树,那么显式地实现它。。。其他任何事情都将是“技术债务”/“desaster等待发生”IMHO。这是页

我在网上看到了一些关于这方面的引述,但没有官方文件?有人能告诉我在哪里可以得到关于这个的信息吗?

从它的MSDN页面:

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

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


不确定这样一个实现细节有多重要,但如果您真的需要一个红黑树,那么显式地实现它。。。其他任何事情都将是“技术债务”/“desaster等待发生”IMHO。

这是页面的官方文档

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


这是一棵红黑相间的树吗

嗯,我不太熟悉,但我只是用(免费的)反编译了
SortedDictionary
类,但红黑树的删除算法和SortedDictionary的Remove()方法的代码看起来并不相似。所以,我的钱是给

SortedDictionary
始终将其键排序。它允许您避免自己对密钥进行排序。它的查找性能比
字典
慢。如果您需要内存中的排序查找表,则它具有优势

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


请查看

中的更多详细信息。由于这是一个实施详细信息,因此不需要记录

例如,
SortedDictionary
有多个实现:有微软的,也有Mono的

事实上,Mono实现在当前版本(2.10.9)中使用了红黑树。当前的.NET版本也是如此(您可以通过反编译代码找到答案,例如使用Reflector、
ildasm.exe
或MonoDevelop中的内置IL查看器)

然而,这可能会在未来发生变化,因为(as)


因此,再次强调:这些信息没有用处,它是一个实现细节,并且很可能会发生变化。

文档似乎确实保证了从BST检索的O(logn)。如果他们报告的是“平均”的可能树,那么即使是非平衡的实现也可以声称这一点。即使这是一种更糟糕的情况保证,但这一点加上作为BST还不足以说明它是否实现为红黑树,而无需进行反编译。它也可以是AVL、splay或其他平衡类型

我拿出了dot peek。在4.0.0.0系统部件上。OrderedDictionary使用Treeset,它是SortedSet的子类。这很可能是一棵红黑相间的树。然而,这不是一个典型的例子,与web上的许多例子类似,这些例子在插入或删除后实现平衡。实现主要是迭代的,插入似乎是在向下的过程中而不是在插入之后固定颜色(自上而下-有几篇关于这种方法的论文)。移除过程中出现了类似的情况,但没有时间验证。当然不是直接可比的


至少,我猜它应该具有类似的运行时特性。当它到达插入/删除点时,已经没有什么作用了,因为它都是在向下的过程中完成的。

不确定您反编译了什么,但是
SortedDictionary
内部只使用
TreeSet
,这是一个内部类,是的,是用红黑树实现的。@KonradRudolph-Hmm,我反编译了
Remove()
方法,它使用了
内部虚拟bool DoRemove(T项)
方法,但它与
红黑树(二叉树搜索)似乎没有任何相似之处。我在这里遗漏了什么?我目前实际上还没有访问.NET实现(我在Mac上),但我已经检查了相关资源和Rotor参考实现(当然不是官方的)我几乎可以肯定,
SortedDictionary
确实使用了
TreeSet
,这是一个红黑树。而且,MSDN文章实际上保证了(当前的)
SortedDictionary
是一个二元搜索树,因此您对
DoRemove
方法的评估肯定是错误的。话虽如此,但奇怪的是,MSDN实际上在这一点上是特定的,因为正如我在回答中所写的,使用二进制搜索树(而不是泛化搜索树)是一个实现细节,而且它一定会改变,所以此信息在MSDN中没有位置。参考源确认它是一棵红黑树(至少在4.5.2中);当微软以开源形式发布.Net时,为什么要进行反编译?这并没有回答问题。@GregGraham怎么没有?我清楚地解释了当前(在回答时)的实现在做什么,以及为什么这些信息在将来不应该被依赖。你在答案中还遗漏了什么?