C#中红黑树的实现

Posted

技术标签:

【中文标题】C#中红黑树的实现【英文标题】:Implementation of Red-Black Tree in C# 【发布时间】:2010-12-14 18:24:45 【问题描述】:

我正在寻找 C# 中 Red-Black Tree 的实现,具有以下功能:

在 O(log n) 中搜索、插入和删除。 成员类型应该是通用的。 支持Comparer(T),用于按其中的不同字段对T 进行排序。 在树中搜索应该使用特定的字段,所以它不会接受T,但它会接受对它进行排序的字段类型。 搜索不应该只是精确值。应该支持搜索较低/较高的。

谢谢。

【问题讨论】:

回答您的另一个名为“书或老师”的问题,真正学习编程的最佳方法是编写程序。自己写一个,然后你就会学到一些东西。 @Pavel:我可以写这个,但我正在寻找一些准备好的东西,所以我可以继续开发我的程序的主要方面,并加快开发速度。 【参考方案1】:

您大多只是描述了SortedDictionary<T, U>,除了次低/次高二分搜索,您可以轻松地自行实现。

SortedDictionary 对你来说不够用有什么具体原因吗?

【讨论】:

“您可以轻松地自行实现。” 我不相信您可以轻松扩展 SortedDictionary。从查看元数据并简单地尝试扩展它,似乎无法访问必要的内部部分。我错了吗? 你的意思是 SortedDictionary 实现了一个红黑树?如果你这样做了,你在哪里找到的?我在 MSDN 页面上没有看到任何提及。 是的;我只是通过浏览 Reflector 中的课程来验证它。在内部,它将密钥放入SortedSet<T>,实现为红/黑树。我不确定我是从哪里听说的——我觉得旧版本的 MSDN 文档更详细地介绍了 SortedDictionary 的实现,而不是 SortedList。另外,嗯,我不确定为什么我认为他可以轻松扩展它。尚不清楚他是否可以。哦,好吧。【参考方案2】:

从 C5 集合库中提取 TreeSet。

【讨论】:

【参考方案3】:

这正是 PowerCollections 中的 OrderedDictionary。它与 SortedDictionary(带有泛型的红黑树)几乎相同,除了能够设置开始键/结束键并扫描该范围内的所有值。

SortedDicionary 只允许公开一个从集合开头开始的 GetEnumerator() 函数,并且只允许一个 MoveNext() 调用,因此即使您使用 LINQ 也不会发生任何神奇的事情:它从开头开始并运行您的表达式按顺序在每个节点上,直到找到与您的 LINQ 表达式匹配的节点。

OrderedDictionary 有一个函数可以在特定键处或之前获取枚举器,并在 O(log n) 中进行查找。

但请注意:PowerCollections OrderedDictionary 中的枚举器是使用“yield”实现的,内存使用和枚举性能至少为 O(n^2)...您可以自己更改实现以使其实现一个传统的枚举器,这两个问题都消失了。如果我能找到时间,我会将该补丁提交给 Codeplex。

【讨论】:

以上是关于C#中红黑树的实现的主要内容,如果未能解决你的问题,请参考以下文章

001 红黑树之 原理和算法详细介绍

什么是红黑树?

一篇文章教你透彻了解红黑树

C高级 框架开发中红黑树结构

红黑树 实现

红黑树介绍与实现