AVL, 红黑树,B树
前段日子在研究着这几中树的优劣
首先我们来谈谈AVL树,AVL树是一棵平衡的二叉查找树。它的平衡因子为-1,1,0不平衡达到2就会将树进行平衡化。 AVL对数字的分布要求比较高,比如说是随机数,有人曾经做过计算,在利用AVL树与红黑树进行插入运算的时候,AVL树在数字分布的较为集中的时候会不断的进行着树的左右旋,这在时间上是巨大的浪费。
那么红黑树呢,红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决.红黑树在平衡上是不如AVL树。但是红黑树应用的比较的广,特别是C++中的关联数组,所谓的关联数组就是以键值对的形式进行存放数据的形式。比如说MulitiMap。
B树,应用的较多的在数据库中,文件系统中。在文件系统中,因为数据比较的大,所以通常选择的是放在磁盘等其他的硬件中,那么对于读取的时间要求比较高。一棵M阶的B树,在查找方面高于二叉树(对于有同样多数据的情况下)。它的一个节点有时候代表的是一个快或者操作系统中的一页,我们知道在操作系统中,有页存储式,也有段存储式,当然还有改进的段页式。在页存储式中,我们有程序页表(描述程序占用的物理页面及逻辑排列顺序)。物理页面表(描述物理内存空间的分配使用状况)。请求表。每一个程序进行运行的时候都会有一个请求表(描述系统内各个程序页表的位置和大小,用于地址转换)。在请求表中有很多的块,在块中描述着每一个在哪一个页,就对应着页表中的内容,页表中相应的指针指向的是物理存储的地址。程序地址空间分成大小相等的页面(page frame),同时把内存也分成与页面大小相等的块,当一个用户程序装入内存时,以页面为单位进行分配。那么这个时候如果我们应用B-树的时候,因为叶子节点并不是存储了所有的数据,尽管一个节点会放一个页的数据,那么会产生跨页的情况,
于是我们的B+树出现了,B+树中将所有的关键字放在叶子节点中,非叶子节点放索引。那么查找的时候就可以不用跨页
由上面我们知道在B树中是针对大量数据时候使用的,对于一般的数据建议使用红黑树或者其它的数据结构就好,在平衡树中红黑树使用的是比较广的,查找二叉树中如果高度太大时间上消耗的比较多。而且很可能出现左子树或者右子树的情况。对于B树中,我们知道一个节点可能会存放几个数据,这种情况查询时间上消耗的还是比红黑树多的
当你对树中检索的次数比插入、删除的次数多的时候用AVL树
当你对树中插入、删除、检索差不多的时候用RB树
当有很多数据且数据从硬盘或者其他较慢的设备中时用B树
以上就是个人的理解。请各位指正