这是在一次面试中问道的题目:面试官的本意,应该是说avl和红黑树在平衡上的区别,导致的应用场景的区别!我也复习了很多次有关树的概念和应用的区别,当时我算是发现了不写下来,不自己综合的整理一遍始终记不住,而且记不久
先解答:红黑树,区别于avl树(平衡二叉树)----都是在对应的二叉搜索树下面,可以看后续的总结,因为不是强一致性平衡,所以增删改比较适合,因为旋转次数少,如果查询比较多,则avl比较适合,因为对应的查询深度比较统一
树:
满二叉树:高度为h,并且由2h-1个结点组成的二叉树
完全二叉树:最下面两层结点的度可以小于2,最下层的叶结点集中在靠左的若干位置上
二叉搜索树 :
对数访问性能:
分:
avl(二叉平衡搜索树==平衡二叉树:):高度差不可以超过一(在完全二叉树基础上,可以不满足最左侧以及有序条件)
红黑树:最长路径不超过最短路径的两倍
哈夫曼树(Huffman Tree):路径上带有权重
多路查找树
B树 :每个节点既有数据又有指针,
b+树:数据都在根节点,注意:看到的数据也许只是索引作用的指针
b*树:是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针
b+树在MySQL的innodb的底层用的比较多:参考扩展链接:InnoDB一棵B+树可以存放多少行数据?
在MySQL中我们的InnoDB页的大小默认是16k,当然也可以通过参数设置:
比较重要的结论:
根据同样的原理我们可以算出一个高度为3的B+树可以存放:1170117016=21902400条这样的记录。
所以在InnoDB中B+树高度一般为1-3层,它就能满足千万级的数据存储。在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找到数据。
MySQL的面试题,为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?
简单版本回答是:
因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
mysql系列解读请关注再看:后续将解读mysql的源码:
参考链接: