一、树
1、论红黑树和AVL树的定义,特点,以及二者区别?
(1)平衡二叉树(AVL)
平衡二叉树又称为AVL树,是一种特殊的二叉排序树。其左右子树都是平衡二叉树,且左右子树高度之差的绝对值不超过1。
总结:以树中所有结点为根的树的左右子树高度之差的绝对值不超过1。
将二叉树上节点的左子树深度减去右子树深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只能是-1,0,1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。
(2)红黑树(RBTree)
红黑树是一种二叉查找树,但在每个结点增加一个存储位表示结点的颜色,可以是红或者黑(非红即黑)。通过对任何一条从根到叶子的路径上各个结点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树,相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,通常使用红黑树。
(map和set的底层均为红黑树)
性质:
每个结点非红即黑
根节点是黑的
每个叶结点(叶结点即树尾端NULL指针或NULL结点)都是黑的
如果一个结点是红色的,则它的子结点必须是黑色的
对于任意结点而言,其到叶子结点树NULL指针的每条路径都包含相同数目的黑结点
区别:
AVL树是高度平衡的,频繁的插入和删除,会引起频繁的rebalance,导致效率下降;红黑树不是高度平衡的,算是一种折中,插入最多两次旋转,删除最多三次旋转。
为什么map底层使用红黑树实现?
红黑树是一种弱平衡二叉树,相对于严格要求的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,通常用红黑树。
map和unordered_map的底层实现
map底层是基于红黑树实现的,因此map内部元素排列是有序的,而unordered_map底层是基于哈希表实现的,因此其元素排列顺序是杂乱无序的。
map和unordered_map的优点和缺点
1、对于map,其底层是基于红黑树实现的
优点如下:
1.有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多操作。
2.map的查找、删除、增加等一系列操作时间复杂度稳定,都为logn。
缺点如下:
1.查找、删除、增加等操作平均时间复杂度较慢,与n相关。
2、unordered_map来说,其底层是一个哈希表
优点如下:
查找、删除、添加的速度快,时间复杂度为常数级O(c)
缺点如下:
因为unordered_map内部基于哈希表,以(key,value)对的形式存储,因此空间占用率高。
unordered_map的查找、删除、添加的时间复杂度不稳定,平均为O(c),取决于哈希函数。极端情况下可能为O(n)。
对于epoll的了解
linux epoll机制是通过红黑树和双向链表实现的。
首先通过epoll_create()系统调用在内核中创建一个eventpoll类型的句柄,其中包括红黑树根节点和双向链表头结点。
然后通过对epoll_ctl()系统的调用,向epoll对象的红黑树结构中添加、删除、修改感兴趣的事件,成功返回0,失败返回-1。
最后通过epoll_wait()系统调用判断双向链表是否为空,如果为空则阻塞。当文件描述符状态改变,fd上的回调函数被调用,该函数将fd加入到双向链表中,此时epoll_wait函数被唤醒,返回就绪好的事件。