Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures AVL树与B树_Data Structures_B Tree_Avl Tree - Fatal编程技术网

Data structures AVL树与B树

Data structures AVL树与B树,data-structures,b-tree,avl-tree,Data Structures,B Tree,Avl Tree,AVL树与B树有何不同?AVL是自平衡的,保证所有操作在平均和最坏情况下都是O(对数n)。AVL树是自平衡的二叉搜索树,平衡以保持O(对数n)高度 B-树是平衡树,但不是二叉树。节点有更多的子节点,这会增加每个节点的搜索时间,但会减少搜索需要访问的节点数。这使它们适合于基于磁盘的树。有关更多详细信息,请参阅。AVL树用于内存使用,其中随机访问相对便宜。B树更适合于磁盘备份存储,因为它们将更多的密钥分组到每个节点中,以最小化读或写操作所需的寻道次数。(这就是为什么在文件系统和数据库中经常使用B-树

AVL树与B树有何不同?

AVL是自平衡的,保证所有操作在平均和最坏情况下都是O(对数n)。

AVL树是自平衡的二叉搜索树,平衡以保持O(对数n)高度


B-树是平衡树,但不是二叉树。节点有更多的子节点,这会增加每个节点的搜索时间,但会减少搜索需要访问的节点数。这使它们适合于基于磁盘的树。有关更多详细信息,请参阅。

AVL树用于内存使用,其中随机访问相对便宜。B树更适合于磁盘备份存储,因为它们将更多的密钥分组到每个节点中,以最小化读或写操作所需的寻道次数。(这就是为什么在文件系统和数据库中经常使用B-树的原因,例如。)

AVL树和B-树都是相似的,因为它们都是数据结构,根据它们的要求,使得它们各自的树的高度最小化。这种“短”允许在O(logn)时间内执行搜索,因为最大可能的读取次数对应于树的高度

    5
   / \
  3   7
 /   / \
1   6   9
这是一个AVL树,它的核心是一个二叉搜索树。然而,它是自平衡的,这意味着当您向树中添加元素时,它将重新构造自身,以尽可能保持高度的一致性。基本上,它不允许长分支

B-树也可以这样做,但通过不同的重新平衡方案。写出来有点太复杂了,但是如果你用谷歌搜索“B树动画”,有一些非常好的小程序可以很好地解释B树

它们的不同之处在于,AVL树是用基于内存的解决方案实现的,而B树是用基于磁盘的解决方案实现的。AVL树并不是为了保存大量数据而设计的,因为它们使用动态内存分配和指向下一个内存块的指针。显然,我们可以用磁盘位置和磁盘指针复制AVL树的功能,但是速度会慢得多,因为我们仍然需要大量的读取来读取一个非常大的树


当数据收集太大以至于无法放入内存时,解决方案是B-树(有趣的因素ID:对于“B”实际上代表什么没有共识)。B-树在一个节点上包含许多子节点和指向子节点的许多指针。这样,在磁盘读取期间(读取单个磁盘块大约需要10 ms),将返回最大数量的相关节点数据,以及指向“叶节点”磁盘块的指针。这允许将数据的检索时间分摊到日志(n)时间,使得B-树对于数据库和大型数据集检索实现特别有用。

B-树使用了上述所有思想。特别是,B-树:

1)keeps keys in sorted order for sequential traversing
2)uses a hierarchical index to minimize the number of disk reads
3)uses partially full blocks to speed insertions and deletions
4)keeps the index balanced with an elegant recursive algorithm

此外,B树通过确保内部节点至少已满一半,从而最大限度地减少浪费。B-树可以处理任意数量的插入和删除。

AVL树是一种自平衡二叉树,它为搜索插入和删除操作启用O(lgN)平均和最坏情况。它用于内存支持的搜索树(中等大小的数据集)

B树主要用作超大数据集的存储备份搜索树,因为它需要较少的磁盘读取(因为每个节点包含N个键,其中N>1)。B-树被称为(N,N+1)B-树,其中N是每个节点的密钥数,N+1是每个节点的子节点数。每个节点的密钥越多,您需要从磁盘读取的次数就越少,而且它自然也是一棵较浅的树(级别越低)。

用外行的话说-

AVL树和二叉搜索树都是相同的,但AVL树有一个约束,即左子树和右子树的高度差应为0、1或-1

如果任何二叉搜索树满足这些条件,它将被称为AVL树

二叉搜索树+高度条件是AVL树

参考:Cormen算法简介

其他回答者已经提供了关于AVL和B-Tree的相当深入的技术细节,但我想补充一个关于这两个方面的相对新手的信息:

  • AVL树是一棵二叉树,而B树是一棵多向树(N元树),即AVL树中的任何节点最多可以有两个子节点和一条信息/数据,而B树中的任何节点都可以有N个节点和N-1条信息/数据。对于B-树,n也被称为其顺序

它们确实非常不同,尽管它们的用途基本相同:支持关联表。从历史上看,AVL树在内存操作方面的表现优于B树,但与CPU周期相比,访问内存的成本较低(er)时尤其如此

虽然B-树通常用于存储可变长度的键,但对于固定长度和短记录(键+数据),B-树的性能最好。对于这样的使用,无论是在内存占用(因为它们存储数据更紧凑)还是在速度(它们会有更好的缓存局部性)方面,这都可能大大优于内存中使用的AVL树


是一个数据结构库,在B树上实现非常快速的关联表和序列。它还有AVL树,比较两者的性能很容易。

B-tree

这里的一个典型用例是磁盘上的数据库,在这种情况下,在树中查找一个项目的成本很高。当你不得不这样做的时候,你需要尽可能减少工作量。每个b-树都有一个最大度,每个节点保存项目和对其他节点的引用(n个项目,n+1个引用)。这一事实使得在磁盘上存储和以后查找项目块变得很容易。它还允许您