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。从查看元数据并简单地尝试扩展它,似乎无法访问必要的内部部分。我错了吗? 你的意思是 SortedDictionarySortedSet<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#中红黑树的实现的主要内容,如果未能解决你的问题,请参考以下文章