C# 标准库中的 B-tree 类? [关闭]
Posted
技术标签:
【中文标题】C# 标准库中的 B-tree 类? [关闭]【英文标题】:B-tree class in C# standard libraries? [closed] 【发布时间】:2014-01-03 18:59:19 【问题描述】:C#(.NET 或 Mono)基类库中的哪些类直接实现 B-trees,或者可以快速覆盖/继承以实现 B-trees?我看到了 Hashtable 类,但似乎找不到任何来自 Tree
家族的类...
必须有一个基 Tree 类可以被覆盖以生成特定的 Tree 实现(如 B-tree 或 Red-Black 或 Binary Tree 等,通过指定树不变条件)。让程序员重新发明基本数据结构的***是没有意义的(树在 CompSci 中非常基本),尤其是在面向对象的语言中;所以我很确定我只是搜索不正确......
编辑:
-
我没有使用 Hashtable,也不认为它与树有关。我只是将它用作“BCL 中的另一个数据结构类”的示例。
对于那些对背景又名用例感到好奇的人。它用于 O(log(N)) 搜索内存中的关联集。想象一下为该关联集创建一个索引...
【问题讨论】:
Hashtable
不使用基于树的结构。它使用哈希表。你也不应该在遗留代码之外使用它;您应该改用通用的Dictionary
。 SortedDictionary
与 Dictionary
不同,在内部使用基于树的结构,SortedSet
也是如此,尽管两者都没有在外部公开所述树结构。
更深层次的问题是,你需要这样一个特定的集合做什么?系统集合对于大多数用途来说足够通用且足够高效(尤其是在引入不可变集合的情况下)。 OTOH,如果您的需求如此具体以至于这些集合不足,那么您最好从书籍或论文中实现一个。
树木只是教育的基础,它们在现代处理器上的表现太差了,无法考虑。 Cache is king.
@HansPassant 我不会这么说的;它确实取决于上下文。看看,比如说Expression
,以及最近所做的一切。表达式都是树。数据库也(至少据我所知)依赖树(有趣的是,特别是 B 树)来处理索引,因为它们都非常高效,并且非常适合部分在内存中和部分在磁盘上,这当有更多的数据无法放入内存时,这是关键。我同意虽然它们的使用往往是相当专业的,但它们不仅仅是学术性的。
@Hans Passant:SQL Server 数据库非常有效地使用 B*-Trees。
【参考方案1】:
.NET 中没有 B 树的(公共)实现。
没有公开的通用 Tree 类提供基于树的结构的部分实现。
您需要从头开始编写类似的内容,或者使用 3rd 方实现而不是 .NET 实现。
【讨论】:
【参考方案2】:不幸的是,.Net 没有为 Tree 提供任何库。
但是你可以在网上获得一些关于 B-trees 的帮助
1) https://github.com/rdcastro/btree-dotnet
2) http://social.msdn.microsoft.com/Forums/vstudio/en-US/c51b655d-f288-4fbf-9312-9ae4278ff8b7/b-tree-implementation?forum=csharpgeneral
【讨论】:
B-Tree 不是二叉树。这是一个 N 元搜索树。 你是对的。我误读了。我已经用其他有用的链接更新了答案。【参考方案3】:我知道我参加聚会已经很晚了,但我在 BPlusTree 上取得了巨大的成功。作者在这方面做得非常出色。 http://csharptest.net/projects/bplustree/
【讨论】:
不幸的是,这个不再维护,.NET Standard fork 似乎也没有完全正常工作。【参考方案4】:您可能想查看我在 GitHub 中对 B 和 B+ 树的通用 C# 实现。
Advanced-Algorithms
【讨论】:
【参考方案5】:B-Tree for .NET on codeplex 的实现看起来很有希望。 Performance-wise也是。
代码使用 Store API 来存储和管理数据的键/值对。 Internal Store 实施使用增强的、现代化的 B-Tree 实施,可虚拟化 RAM 和磁盘存储。
与传统相比,此 B-Tree 的几项关键增强
实现是:
节点负载优化使其保持在大约 75%-98% 的全平均负载 内部和叶节点。传统的 B-Trees 只能实现大约 半满 (50%) 平均负载。这转化为更压缩或 更密集的数据存储使 IT 部门免于使用昂贵的存储硬件。 在特定情况下,叶节点的高度不允许完美平衡,以支持以零/最小成本实现删除速度 交换。此外,由于删除导致的高度差异往往会得到 由于节点负载优化功能,在插入期间修复 上面讨论过。 等...更多增强功能等待记录/在时间允许的情况下引用。
【讨论】:
以上是关于C# 标准库中的 B-tree 类? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
跨越不同JVM的Java标准库中的SerialVersionUID