Data structures 红黑树对B树

Data structures 红黑树对B树,data-structures,b-tree,red-black-tree,file-mapping,large-data,Data Structures,B Tree,Red Black Tree,File Mapping,Large Data,我有一个项目,在这个项目中,我必须实现从兆字节到兆字节的数据的快速搜索、插入和删除操作。我最近一直在研究数据结构并对其进行分析。具体来说,我想介绍3个案例,并就此提出问题: 数据远远超过了内存一次性处理的能力(样本范围为10-15TB)。在这种情况下,我会将数据结构存储在磁盘上 与系统内存相比,数据相对较少,因此可以在内存中存储和操作,以提高速度 数据不仅仅是可用内存,并且假设它小于分页文件中可能的连续数据块的大小。因此,我将数据结构存储在磁盘上的一个文件中,并对该文件进行内存映射 我得出的结论

我有一个项目,在这个项目中,我必须实现从兆字节到兆字节的数据的快速搜索、插入和删除操作。我最近一直在研究数据结构并对其进行分析。具体来说,我想介绍3个案例,并就此提出问题:

  • 数据远远超过了内存一次性处理的能力(样本范围为10-15TB)。在这种情况下,我会将数据结构存储在磁盘上

  • 与系统内存相比,数据相对较少,因此可以在内存中存储和操作,以提高速度

  • 数据不仅仅是可用内存,并且假设它小于分页文件中可能的连续数据块的大小。因此,我将数据结构存储在磁盘上的一个文件中,并对该文件进行内存映射

  • 我得出的结论是:

    对于案例1,我应该使用B树来加快访问速度,因为它可以节省磁盘旋转产生的延迟

    对于案例2,我应该使用红黑树以加快访问速度,因为数据在内存中,在更糟糕的情况下需要扫描的元素数量将少于使用B树时必须扫描的元素数量

    对于案例3,我对此表示怀疑,页面文件在磁盘上使用本机操作系统I/O对文件进行操作,那么B树是更好的选择还是红黑树

    我想知道上述三个结论的正确之处和错误之处,以及在这三种不同的情况下我如何改进性能

    我使用的是C++语言,有红黑树和B树,我都是从头开始设计的。我正在使用Boost库进行文件映射


    更新1::正在通过stackoverflow中的post进行读取。我得到了一些非常好的见解,这让我觉得我在案例中所做的比较可能是错误的。在投票最多的答案中贴出了一个链接

    一棵红/黑树或多或少相当于一棵2-3-4树,这只是一种B树。如果对B-树节点值进行二进制搜索,最坏情况下的性能是相同的

    B树的明显缺点是浪费空间,但根据使用的语言/内存分配器,您可能会发现2-3-4树平均比红黑树使用更少的空间。例如,在32位Java中,每个对象大约有8字节的开销。(这在很大程度上取决于分配器;IIRC phkmalloc将小的分配汇总为2次方大小。)

    为了回答你的问题

  • 磁盘延迟大致在寻道时间和等待磁盘旋转之间平均分配
  • 如果你做得对,B-树应该能够比红黑树跑得更快(特别是,如果节点适合缓存线,B-树应该更快。)
  • 它不需要在页面文件中是连续的;它只需要在进程的虚拟地址空间中是连续的。对于理智的操作系统,它也与案例1几乎相同,除非您的数据足够小,以至于它大部分都可以放入内存,并且memcpy开销很大

  • 为了简单起见,我会使用B-树,并在不同的节点大小上运行一些基准测试。

    要了解它们之间的区别,请阅读以下两点:

    1) “红黑树”是一种“自平衡”的“二叉搜索树”, 使用颜色(红色或黑色)标记每个节点,并在其上定义附加操作以保持“平衡”


    2) 所有的“红黑树”都是“二叉搜索树”,但所有的“二叉搜索树”都不是“红黑树”

    你要做什么样的搜索?简单的按键搜索?钥匙是什么样子的?你或多或少是对的。继续执行,在这里询问您是否遇到问题。@s单击“是”,我正在按键进行简单搜索,在最一般的情况下,它们可以是一组离散的,或以数字连续顺序排列的不同自然数,从1开始表示一个值,如(2^8)-1非常感谢您的输入;即使数据集很大,您是否建议使用2-3-4树?如果节点大小与磁盘中的页面大小相似,不是更好吗?您确实有支持2-3-4树作为红黑树的替代品的优点,尽管我说过“在各种节点大小上运行一些基准测试”。仅仅使用B-树的优点是,您可以运行一些基准测试并根据自己的喜好调整它。您可能还需要考虑数据的局部性(即,如果您的键是字符串,那么您可能希望将字符串保持在节点附近)。如果分页速度较慢,那么您肯定希望节点至少与页面大小一样大,但可能更大(假设您的磁盘没有预读)。对于SSD,答案也不一样……这个解释听起来好像BST和B树是一样的。比较不是在RBT和BST之间,而是在RBT和B树之间。RBT和B-Tree都是bst。RBT和B-树都是平衡的。B-树不是二叉搜索树,因为B-树节点可以有多个子节点。这并不能回答问题。OP想要比较红黑树和B树。你说的是红黑树和二叉搜索树