树结构

二叉树

平衡二叉树

AVL树:

AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效,适合查找远远多于插入、删除的场景。但AVL树插入、删除结点后旋转的次数比红黑树多,即插入删除效率低于红黑树。

红黑树:

一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是red或black。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍。它是一种弱平衡二叉树,用非严格的平衡来降低插入删除时旋转的次数。相对于严格的AVL树来说,它的旋转次数变少,所以对于搜索、插入、删除操作多的情况下,我们就用红黑树。

AVL数与红黑树的区别:

两者每一次对树的修改, 都要 rebalance, 这里的AVL树开销会比红黑树大。插入时两者都是O(1);删除时,最坏情况下,平衡二叉树AVL树需要O(logN),而红黑树只需要O(1)的复杂度, 所以平衡二叉树需要rebalance的频率会更高,因此红黑树在大量插入和删除的场景下效率更高

JDK8中,ConcurrentHashMap去除了JDK7中的分段锁segment机制,当链表的长度超过8时,会调用treeifyBin(tab , i)方法将链表结构转换为红黑树。因为hashcode冲突过多,导致链表变长,影响查询效率。一开始并非直接转换为红黑树,而是通过扩容table到2倍的方式,只有table的长度大于64之后,才会将超过8个元素的链表转红黑树。红黑树的构造过程是在TreeBin的构造方法中完成的。红黑树的平均查找长度是log(n),如果长度为8,平均查找长度为log(8)=3,链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要;链表长度如果是小于等于6,6/2=3,而log(6)=2.6。8是根据概率统计的泊松分布决定的。

B/B+树:

B/B+树不是二叉树,而是N叉数,N可以很大,从而降低树的高度,是矮胖型的树形结构。对于这个特性,在数据库索引文件系统领域应用广泛,因为树的高度低,本质上利用了内存和磁盘指数级的性能差异。索引查找时,可将根和第二层都缓存在内存(比如N=1000),过滤性直接就是1/1000。然后再去磁盘查找这1/1000的数据。

B树与B+树的区别:

B树,每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。


B+树,只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针。因为叶子节点在磁盘,上层的指针可以缓存在内存,要尽量在内存中获取过滤性,内节点不存储data,这样一个节点就可以存储更多的key。同时节省空间,B+数除叶子节点外不存储数据正好满足这一特性


你可能感兴趣的:(树结构)