在linux *** 作系统内核实现里经常使用的红黑树如下:
二叉树,按中序遍历后为一递增数组,自平衡意味着树的高度有一个上限,对于红黑树,其为2log(n+1),所以时间复杂度为最差为Olog(n)。
赋予二叉搜索树自平衡特性的方法有多种,红黑树通过一下4条约束实现自平衡:
Every node is either red or black.
All NIL nodes (figure 1) are considered black.
A red node does not have a red child.
Every path from a given node to any of its descendant NIL nodes goes through the same number of black nodes.
其中根节点为黑色。
红黑树的搜索与二叉搜索树无异,但是插入和删除可能会违背上述四条原则。需要用到左旋右旋 *** 作。左旋右旋上图,可以看到左旋右旋本身不改变二叉搜索树的特性,旋转后必要时改变节点的颜色可消除插入或者删除带来的红冲突和黑冲突,有时红黑树的重新平衡需要迭代进行。
红黑树比较适合的应用场景:
需要动态插入、删除、查找的场景,包括但不限于:
某些数据库的增删改查,比如select * from xxx where 这类条件检索。
linux内核中进程通过红黑树组织管理,便于快速插入、删除、查找进程的task_struct。
linux内存中内存的管理:分配和回收。用红黑树组织已经分配的内存块,当应用程序调用free释放内存的时候,可以根据内存地址在红黑树中快速找到目标内存块。
hashmap中(key,value)增、删、改查的实现;java 8就采用了RBTree替代链表。
Ext3文件系统,通过红黑树组织目录项。
1、 初识红黑树从网上搜索了许多红黑树的介绍,这些文章中主要介绍了红黑树的性质,然后就是红黑树的旋转如下示意图。
左旋、右旋,旋转过程中爸爸变成了儿子,兄弟变成了孙子;红的变成黑的,黑的变成红的。经过一系列的旋转,就把我旋转的晕头转向了,脑子里搅成了一团浆糊。相信,没有学过二叉树的同学肯定会遇到和我一样窘况。
TreeMap 会自动对其存储的元素进行排序。TreeMap 内部采用红黑树的数据结构来存储元素,红黑树是一种自平衡的二叉搜索树,保证了元素在 TreeMap 中按照键的自然顺序或者指定的比较器进行排序。在 TreeMap 中,添加新元素时会自动按照键的顺序将其插入到红黑树中,这样保证了 TreeMap 中的元素始终是有序的。因此,TreeMap 是一种可以自动排序的 Map 数据结构。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)