务实的家伙对树数据结构应用的困惑

时间:2011-09-06 05:12:03

标签: data-structures tree

长期以来一直在学习数据结构和算法,我仍然不确定那些着名的数据结构的实际应用,如红黑树,splay树。

我知道B-tree已被广泛用于数据库中。 关于其他树数据结构,如红黑树和splay树等,

  1. 他们在实践中被广泛使用了吗?如果有的话,举个例子。
  2. 与B-tree不同,B-tree的结构可以保留并保存在磁盘中,红黑和splay树无法实现,它们只是内存结构,对吧?那么它们如何像B-tree一样受欢迎?

3 个答案:

答案 0 :(得分:3)

  

我知道B-tree已被广泛用于数据库中。

这不是很具体,是吗?

事实上,B树和红黑树为提供完全相同的目的:两者都是索引数据结构,更准确地说是搜索树,即允许你的数据结构有效地搜索集合中的项目。

红黑树和B树之间唯一相关的区别在于后者包含了一些可以改善其缓存行为的其他因素,当由于高延迟而导致内存访问速度特别慢时,这是必需的(简单地说,对B树的平均访问在内存中的跳转要少于在红黑树中的跳转,以及对相邻内存位置的更多读取,这通常要快得多。

从历史上看,这已用于将索引存储在磁盘(辅助存储)上,与主存储(RAM)相比,该索引速度非常慢。另一方面,当索引保留在RAM中时经常使用红黑树(例如,C ++ std::map结构通常实现为红黑树)。

但是,这会发生变化。现代CPU使用缓存来进一步改善对主存储器的访问,并且由于访问RAM比缓存慢得多,因此B树(及其变体)再次变得比红黑树更适合。

答案 1 :(得分:1)

  1. 红黑树的最广泛使用的实现可能是Java TreeMapTreeSet库类,用于实现树状的有序映射和对象集结构体。从this Wikipedia article开始,红黑树需要进行较少的重新洗牌,因为它们不会对结构的完整性施加严格的要求。

  2. 排序树的许多应用程序不需要将数据结构写入磁盘。通常,数据以任意顺序接收或生成,并且仅为使用同一程序的另一部分而分类。在其他时候,数据必须在输出之前进行排序,然后简单地输出为平面文件而不传达树结构。在任何情况下,从简单地将内存的内容写入磁盘就可以得到相对较少的磁盘文件格式。以这种方式存储数据需要恼人的指针调整,更重要的是使盘上格式取决于处理器数据字大小,系统字节顺序和字对齐等细节。数据通常被写为(可能是压缩的)文本,或者以精心定义的二进制格式写入磁盘。我能想到的任何排序树写入磁盘的唯一情况是数据库和文件系统,其中结构从磁盘加载到内存中并按原样使用;在这种情况下,B树确实是首选的数据结构。

答案 2 :(得分:0)

我最喜欢的实际使用示例是CPU调度,this task scheduler采用了Linux 2.6.23内核附带的RB树。当然还有更多,如已经指出的那样,这只是我个人的最爱。