查找树分析

对于规模为n的数据序列的操作取决于三个因素,一是存储方式(数据结构),二是操作方法,三是数据特性。我们来比较一下常用的数据结构下的情况:

其它的诸如队列,栈等数据结构的目的一般不是为了查找,所以这里就不列出对比了。
从上面的分析我们知道,如果纯粹从查找的角度来说,有序数组方式要比查找树好,有序数组的问题就在于其插入和删除操作性能太差(如果数据太大,这种平移需要外部进行时候性能就更低了,需要很多额外的IO操作),另外如果数据太大的时候,因为有序数组的查找是根据数组索引和边界来进行,如果不能一次加载,就需要额外的维护当前加载和索引边界,其结果就会形成2层高度的树,因此有序数组的方式只对于小规模n比较合适。而由于查找树的操作一般是路径操作,每次所需要的数据都比较小,对内存的要求就比较低,便于大规模数据的处理。(另外,有序数组在树中也是可以用的,对于m阶树来说,节点内部的查找就可以用)
从上面的表格我们可以看出,查找树的操作性能弹性比较大,取决于其高度H,降低高度H至少有两个好处,1是可以提高查找性能,2是在数据规模比较大的情况下,减少IO次数(所需IO次数与树的高度H有关)。而对于树来说,有几个比较重要的参数:节点数n,阶m,高度H,宽度W。他们之间有如下关系:m^0+m^1+...m^(H-1) < (m^H-1)/(m-1);W<m^(H-1);min(H)>logm(n)+1;
从这些关系,我们可以看出,如果要降低树的高度,有两个办法,1是增加m,2是树尽量平衡,对于m阶满树而言,在同样高度的情况下,其能表达的节点n最大.对于m而言,如果m等于1或者m=n,那么树就退化成了链表(数组),那么其优势就没有了。所以m应满足:1<m<n,一般来讲m不宜过大,过大的话,m部分变成了主角,就无法体现树的优势了。一般m都取小于10以内的数(现有的B树,B+,AVL的m都小于等于5)。由于m一般来讲是常数,m一旦确定,那么能降低H的就只有保持树的平衡了.
保持树的平衡从理论上来讲比较容易,但实际上却比较难,树的查找和更新问题不大,但插入和删除就有很多问题,在插入或者删除时,为了保持平衡,如果引起的节点变更很多(最坏的情况是重构树),那树的优势就没了,因此如果算法能使得保持树的平衡时的代价控制在可以接受的范围内,就成了树的平衡构造算法的关键,这也是B树,AVL树,红黑树等树的算法目的根本所在。
对于保持平衡来说,又有一个选择,就是是保持高度平衡呢还是相对平衡,高度平衡的话,所引起的平衡操作会比较多比较频繁,如果是相对平衡的话,这种平衡操作和频率就会少一些。无论是保持高度平衡或者相对平衡,其实最简单,最自然的方法就是实时计算树的高度来进行平衡(为减少重复计算树节点可以保存这个高度值),即所谓的平衡因子法,AVL树采用的就是这种方法,而且AVL是高度平衡的,其实这个方法对于m阶(m>2)也是可行的.但在实践中,平衡因子法一般都比较容易实现成高度平衡的。而对于相对平衡来说,控制的方法都是从m入手.我们知道,对于m阶树而言, 高度H与树的节点子节点数(丰满度)是有关的(min(H)>logm(n)+1),通过控制树的丰满程度也可以达到降低树的高度H的目的。这其实就是B树,2-3-4树的根本思想。
对于树节点插入或删除时要保持树的平衡,方法就是按要求调整和移动节点,而树的旋转可以看做是这种调整和移动节点的一种模式,注意,既然是模式就有前提条件,不是什么时候都能用的(旋转一般都只用在2叉树中,比如红黑树,AVL树,对于m>3阶,好像还没有,而对于大于3阶的一般都采用分拆和合并,其实这也是调整和移动节点的基本方法).
另外需要注意的是,一般查找树都是基于一些数据索引的,索引所代表的数据本身都比较大,因此树节点中一般不保存对应数据本身;树这种结构其实也不利于块处理,而数组则比较适合这种操作,因此有的时候在构造树的时候往往都将叶子节点保持在同一层,维持成一定的数组特性,这样可以便于批量处理,这也是B+树的思想.

注:红黑树其实是一种相对平衡的2叉树,设高度为h=red+black,因为红不能相邻,必然有red<black(因为根节点和叶子节点都是黑色,等号不成立).因为任意路径上black都相等,所以树的高度相差只会是red差,而red差显然不会超过H/2.

PS:B树,红黑树,R树等具体算法可参考July的相关系列文章.http://blog.csdn.net/v_JULY_v.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值