乙树木VS二叉树

问题描述 投票:30回答:2

如果我实现与B树的内存(RAM)搜索操作,然后将它在缓存方面或其他一些效果时与二叉树相比,不是更好吗?

我所知道的是

binary search tress---O(log n)
btrees ---------------O(c log n)

有关于上各种博客的讨论很多。

performance binary-tree b-tree
2个回答
48
投票

算法的复杂性是相同的,因为O(logb N)= O(C log n)的= O(log n)的但恒定的因素,这是隐藏在大O符号,可以显着地变化,这取决于实现和硬件。

B树被设计为盘的硬盘,其具有在此之后整个物理扇区被读出一个大的存取时间(移动头到位置)。使B-树节点一样大的扇区的最小访问次数和最大化有用数据读出的读出操作。

但是,如果你正在制订的内存,你有一个可以忽略不计的访问时间,因此更好的比较是计算你的算法访问单个单词的数量。

例如,让我们计划的数据结构来存储每个1个字的220楼的键,32位机器上的总的原始数据的4MiB的。

二叉查找树将具有220层的节点,各保持一个键和两个指针(3个字)。深度将LOG2(220)= 20。平均搜索将要读出的密钥和由在它的路径中的每个节点的指针中的一个,从根所有向下= 40个字的方式。

对于硬盘制造的B-树将有4kB的节点。每个节点可被内部存储为的键和指针耦合排序后的数组,256和它们的512之间。什么是平均搜索会是什么样子?考虑到平均3/4填充,每个节点都将包含384项,其内部的二进制搜索将有平均的log 2(384)= 5.95键访问。的平均深度将被log384(220)= 2.33,所以我们的搜索将要平均2.33倍读5.95键,或约14个字。

在低扇出(支化系数)的B树,每个节点保持键16和32之间的情况下,平均填充将是24个键,平均深度log24(220)= 4.36,在各节点的二进制搜索将使LOG2(24)= 4.58的比较,和整体平均搜索将要读约20个字。

请记住,最后两个数据结构实现了比二叉树一个更好的结果,因为他们比进行优化修改,读取操作。要插入钥匙插入这些B树之一,你将不得不重写平均一个完整的384个字或24个字的节点上,如果不超过一个,而在二叉树的情况下写操作仍然只需要触摸高达40个字。

(以前我是有错的。感谢@virco和@Groo在意见指出我的错误。)

在任何情况下,似乎内存仅具有低扇出appear to perform better than binary trees in practice B树。

每在特定节点32级的键似乎是一个甜蜜点当前架构中,32位和64位。许多较新的语言和库是使用32键B树作为一个内置的数据结构,沿着或作为哈希表和阵列的替代品。这种用法是由Clojure和其他功能的语言带领,但后来采取了由多个主流语言例如Javascript,与近期重点不变的数据结构(例如,Immutable.js

这个结果可以解释不仅计数的单词数从内存中读取,但缓存未命中也被读取导致CPU停顿和等待RAM操作。如果缓存架构可以获取包含整个B树节点在同一时间的RAM块,我们得到了已成功地用于基于磁盘的大容量存储相同的优化。

在硬盘优化的数据结构的情况下,我们会使用与节点一样大的物理磁盘扇区B树,以减少磁盘访问时间。在这种情况下,我们使用B树与节点一样大,即由三级缓存对内存进行读操作,以减少高速缓存未命中。


7
投票

B树从二叉树在不同的键和指针在存储集群,让您获得无论在磁盘和内存中稍好缓存行为。有一个在渐近(大O)运行时没有任何区别,但。

© www.soinside.com 2019 - 2024. All rights reserved.