各种树的特点

简单总结下二叉查找树,红黑树,B树,B+树,B*树,AVL树,R树的特点关系与用处。

首先他们都是查找树(search tree),支持多种动态集合的操作,search, minimum,maximum,predecessor,successor,insert,delete,既可以用作字典,也可以用作优先队列。一般而言,各种树的操作都与树的高度成正比。

二叉查找树,一颗随机构造的二叉查找树的期望高度为O(lgn),动作集合操作的品均时间为O(lgn),但是并不能总保证二叉排序树是随机构造成的,当树的高度较高的时候,这些动作集合的操作性能可能不比链表好。(致命缺点就是最坏的高度可能很大,性能就很差)。

红黑树,是一种“平衡”查找树的一种,它能保证在最坏的情况下,基本的动态集合操作的时间为O(lgn)。它通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一天路径会比其他路径长出两倍,是接近平衡的。具有五点红黑性质。一颗具有n个结点的红黑树的高度至多为2lg(n+1)。

B树,与红黑树类似,只不过它更适合于磁盘或其他直接存取辅助存储设备,它的树的高度比红黑树低,能够降低磁盘的I/O次数(磁盘I/O速度慢(和内存相差5个数量级)的原因是因为读磁盘时候有机械运动,磁盘臂的移动和磁盘的旋转)。许多数据库系统使用B树或者B树的变形。每个含有n个结点的B树的高度为O(lgn),但是B树的“分支因子”很大,每个结点含有的子女结点很多,所以它的高度比红黑树小的多。B树中的一个结点大小通常相当与一个完整的磁盘页(读写时速度快,而算法运行时间由读写决定),B树结点可以拥有的子女数由磁盘页的大小决定。B树也有五点性质。B树高度为log以T为底(n+1)/2,T为B树的度,(每个非根的内结点至少有T个子女,至多有2T个子女,2T也称为B树的阶数)。

B+树是B树的变形,它把所有的附属数据都放在叶子结点中,只将关键字和子女指针保存于内结点,内结点完全是索引的功能,最大化了内结点的分支因子。不过是n个关键字对应着n个子女,子女中含有父辈的结点信息,叶子结点包含所有信息(内结点包含在叶子结点中,内结点没有指向“附属数据”的指针必须索引到叶子结点)。这样的话还有一个好处就是对于每个结点所需的索引次数都是相等的,保证了稳定性。

B*树是B+树的变体,在B+树非根和非叶子结点再增加指向兄弟的指针;B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。

走进搜索引擎的作者梁斌老师针对B树、B+树给出了他的意见:“B+树还有一个最大的好处,方便扫库,B树必须用中序遍历(左<根<右)的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持。这是数据库选用B+树的最主要原因。比如要查 5-10之间的,B+树一把到5这个标记,再一把到10,然后串起来就行了,B树就非常麻烦。B树的好处,就是成功查询特别有利,因为树的高度(查询到时候树的高度)总体要比B+树(都是一个树的总高度)矮。不成功的情况下,B树也比B+树稍稍占一点点便宜。
    B树比如你的例子中查,17的话,一把就得到结果了,有很多基于频率的搜索是选用B树,越频繁query的结点越往根上走,前提是需要对query做统计,而且要对key做一些变化。(霍夫曼编码类似)
    另外B树也好B+树也好,根或者上面几层因为被反复query,所以这几块基本都在内存中,不会出现读磁盘IO,一般已启动的时候,就会主动换入内存。”
    Bucket Li:"mysql 底层存储是用B+树实现的,知道为什么么。内存中B+树是没有优势的,但是一到磁盘,B+树的威力就出来了"。

R树,是一颗存储高维空间的平衡树,与地图查找有些类似,所有的叶子结点都在同一层上。

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值