我有一个项目,我必须对从兆字节到太字节的数据进行快速搜索,插入和删除操作。我最近一直在研究数据结构并对其进行分析。具体而言,我想介绍3个案例并就此提出问题:
数据远远超过内存可以处理的内容(样本范围为10-15 TB)。在这种情况下,我会将数据结构存储在磁盘上。
与系统内存相比,数据相对较少,因此可以在内存中存储和操作,以提高速度。
数据不仅仅是空闲内存,并且假设它小于页面文件中可能连续数据块的大小。因此,我将数据结构存储在磁盘上的文件中,并对文件进行内存映射。
我得出的结论是:
对于案例1,我应该使用B-Tree来更快地访问,因为它可以节省磁盘旋转产生的延迟
对于案例2,我应该使用红黑树来加快访问速度,因为数据存储在内存中,没有。如果我使用B树
,那么在更糟糕的情况下需要扫描的元素将小于我必须要扫描的元素对于案例3,我怀疑这个,页面文件在磁盘上使用本机OS I / O来操作文件,那么B Tree应该是更好的选择还是红黑树?
我想知道上述三个结论的正确位置和出错的地方,以及如何在三个不同的案例中改进绩效。
我正在使用C ++语言,它有一个红黑树和一棵B树,这些都是我从头开始设计的。我正在使用Boost库进行文件映射。
更新1 ::正在阅读stackoverflow中的this帖子。得到了一些真正好的见解,让我觉得我在案例中所做的比较类型可能有问题。在投票最多的答案http://idlebox.net/2007/stx-btree/stx-btree-0.8.3/doxygen-html/speedtest.html
中发布了一个链接答案 0 :(得分:11)
红色/黑色树或多或少等同于2-3-4树,它只是一种B树。如果您对B树节点值进行二进制搜索,那么最坏情况下的性能是相同的。
B树的明显缺点是浪费了空间,但根据所使用的语言/内存分配器,您可能会发现2-3-4树平均使用的空间比红黑树少。例如,在32位Java中,每个对象大约有8字节的开销。 (这也很大程度上取决于分配器; IIRC phkmalloc将小分配用于2的幂级。)
回答你的案件,
为简单起见,我将使用B树并在各种节点大小上运行一些基准测试。
答案 1 :(得分:0)
要了解这些差异,请阅读以下2点:
1)“红黑树”是“自我平衡”的“二元搜索树”, 每个节点都标有颜色(红色或黑色),并在其上定义了其他操作以维持“平衡”
2)所有“红黑树”都是“二进制搜索树”,但所有“二进制搜索树”都不是“红黑树”