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 不使用基于树的结构。它使用哈希表。你也不应该在遗留代码之外使用它;您应该改用通用的DictionarySortedDictionaryDictionary 不同,在内部使用基于树的结构,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 类? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的标准 I/O 进行非阻塞读取 [关闭]

标准模板库中的栈(stack)

跨越不同JVM的Java标准库中的SerialVersionUID

如何在标准类库中读取 .Net Core 配置?

c++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样

从 jdk-8 开始的 java 标准库中是不是有抽象类与接口使用的示例? [复制]