【发布时间】: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。