1请你来说一说红黑树和AVL树的定义,特点,以及二者的区别
平衡二叉树(AVL树):平衡二叉树是一种特殊结构的二叉排序树。其左右子树都是平衡二叉树,且左右子树高度之差的绝对值不超过1。将二叉树上的结点的左子树深度减去右子树深度的值称为平衡因子,那么平衡二叉树上的所有节点的平衡因子只能是1,-1,0.只要二叉树上有一个节点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。
红黑树:红黑树是一种二叉查找树,但在每个节点增加一个存储位标识节点的颜色,可以是红或黑。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此红黑叔是一种弱平衡二叉树,相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况瞎,通常是用红黑树。
性质:
(1)每个节点非红即黑
(2)根节点是黑的
(3)每个叶节点(叶节点即树的尾端NULL指针或NULL节点)都是黑的
(4)如果一个节点是红色的,则它的子节点必须是黑色的
(5)对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同的黑节点
两者区别:AVL是高度平衡的,频繁的插入和删除会引频繁的rebalance,导致效率下降;红黑树不是高度平衡的,算是一种折中,插入最多两次旋转,删除最多三次旋转。
2 请你说i一下哈夫曼编码
哈夫曼编码是哈夫曼树的一种应用,广泛用于数据文件压缩。哈夫曼编码算法用字符在文件中出现的频率来建立使用0,1表示字符的最优表示方式,具体算法如下:
(1)哈夫曼算法是自底向上的方式构造表示最优前缀码的二叉树T。
(2)算法以|C|个叶节点开始,执行|C|-1次的“合并”运算后产生最终所要求的树T。
(3)假设编码字符集中每一个字符c的频率是f(c)。以f为键值的优先队列Q用在贪心选择时有效地确定算法当前要合并的2棵具有最小频率的树。一旦2棵具有最小频率的树合并后,产生一棵新的树,其频率为合并的2棵树的频率之和,并将新树插入优先队列Q。经过n-1次的合并后,优先队列中只剩下一棵树,即所要求的树T。
3 请你回答一下map底层为什么用红黑树实现
红黑树在查找,插入删除的性能都是O(logn),且性能稳定,所以STL里面很多结构包括map底层实现都是使用的红黑树。
4 请你介绍一下B+树
B+树是一种多路搜索树,主要为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,每个节点可以有多个孩子,并且按照关键字大小有序排列。所有记录节点都是按照键值的大小顺序存放在同一层的叶节点中。相比B树,其具有以下几个特点:
(1)每个节点上的指针上限为2d而不是2d+1
(2)内节点不存储data,只存储key
(3)叶子节点不存储指针
5 请你说一说map和unordered_map的底层实现?
map底层是基于红黑树实现的,因此map内部元素排列时有序的。而unordered_map底层是基于哈希表实现的,因此其元素的排列顺序时无序的。
对于map的优点如下:
(1)有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作
(2)map的查找、删除、增加等一系列操作时间复杂度稳定,都为logn
缺点如下:
(1)查找、删除、增加等操作平均时间复杂度较慢,与n相关
对于unordered_map来说,底层时哈希表,优点如下:
查找、删除、添加的速度快,时间复杂度为常数级O(c)
缺点如下:
因为unordered_map内部基于哈希表,以(key,value)对的形式存储,因此空间占用率高,unordered_map的查找、删除、添加的时间复杂度不稳定,平均为O©,取决与哈希函数。极端情况瞎可能为O(n);