平衡的树木以及空间和时间的权衡

时间:2016-05-15 19:59:37

标签: algorithm data-structures tree b-tree

我正在尝试解决问题3-1,以获取以下链接http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/assignments/MIT6_006F11_ps3_sol.pdf中给出的大输入大小。该解决方案使用AVL树进行范围查询,这让我思考。

当输入大小从一百万增加到十亿甚至更多时,我想知道可扩展性问题。例如,考虑一个整数流(大小:4个字节)和大小为10亿的输入,将整数存储在内存中所需的空间大约为3GB!当您考虑其他数据类型(例如浮点数和字符串)时,问题会变得更糟,输入大小是所考虑的数量级。

因此,我得出的结论是,我需要辅助存储器的帮助来存储所有这些数字和指向AVL树的子节点的指针。我正在考虑将左右子节点存储为单独的文件,但后来我意识到这将是太多的文件,打开和关闭文件需要昂贵的系统调用和耗时的磁盘访问,因此在这一点上我意识到AVL树不行。

我接下来想到了B-Trees以及它们提供的优势,因为每个节点都可以有'n'个孩子,从而减少了磁盘上的文件数量,同时在每个级别包含更多的密钥。我正在考虑为节点创建单独的文件,并在生成文件时将密钥插入文件中。

1)我想问一下我的方法和思维过程是否正确 2)我是否使用正确的数据结构,如果B-Trees是正确的数据结构,那么应该使应用程序有效的顺序是什么?什么味道的B树将产生最大的效率。对不起,很长的帖子!提前感谢您的回复!

1 个答案:

答案 0 :(得分:1)

是的,您的推理是正确的,尽管可能比每个文件存储一个节点更智能的方案。事实上,B(+) - Tree在实践中通常优于二叉搜索树(特别是对于非常大的集合),原因有很多,这就是为什么几乎每个主要数据库系统都将它用作主索引结构。二元搜索树表现不佳的一些原因是:

  1. 相对较大的树高(10亿元素〜高度30(如果完全平衡))。
  2. 每次比较都是完全不可预测的(50/50选择),因此硬件无法预先获取内存并使用指令填充cpu管道。
  3. 在上面的几个级别之后,你跳得很远,到内存中不可预测的位置,每个都可能需要访问硬盘。
  4. A B(+) - 具有高阶的树将始终相对较浅(高度为3-5),这减少了磁盘访问次数。对于范围查询,您可以从内存中连续读取,而在二叉树中,您可以跳转很多。在节点中搜索可能需要更长的时间,但实际上你会受到内存访问的限制而不是CPU时间。

    那么,问题仍然是使用什么命令?通常,节点大小选择等于页面大小(4-64KB),因为优化磁盘访问是最重要的。页面大小是计算机可以从磁盘加载到主内存的最小连续内存块。根据密钥的大小,这将导致每个节点的元素数量不同。

    对于实现的一些帮助,只需看看B + -Trees如何在数据库系统中实现。