在大量数据中常用的查找数据的做法有四类:顺序查找,二分查找,二叉树查找(BST),红黑树查找(RBT)。
这四类查找方法分别对应着四种基本思想原理:
顺序查找 —— 无序简单查找
二分查找 —— 有序查找,每次折半搜索,插入数据费时
二叉树查找(BST) —— 不平衡二叉树有序查找,插入与搜索综合性能较优
红黑树查找(RBT) —— 平衡二叉树有序查找,插入与搜索综合性能最优
注:从上至下平均性能变优,算法难度增大,后三种查找为有序查找。
红黑树(RBT)性能分析
在编写红黑树实现前很有必要对其性能进行分析,通过与前三种算法的比较,分析出现RBT这种数据结构的原因。
算法 | 最坏查找 | 最坏插入 | 平均查找 | 平均插入 | 是否有序 |
---|---|---|---|---|---|
顺序查找 | N | N | N/2 | N | 否 |
二分查找 | lgN | N | lgN | N/2 | 是 |
二叉树查找(BST) | N | N | 1.39lgN | 1.39lgN | 是 |
红黑树查找(RBT) | 2lgN | 2lgN | 1.001lgN | 1.001lgN | 是 |
顺序查找
顺序查找是指对数据进行无序的从头至尾扫描,这种方法是最原始的最坏情况下查找目标数据需要遍历整个数组,平均查找需要遍历半个数组。而插入则需要完全遍历整个数组。
二分查找
二分查找是查找时间最短的方法,将数组每次以中间值判断,稳定查找lgN(注:lg = log2)时间。但二分查找的插入则需要花费N的复杂度级别的时间来完成。如果我们采用类似二分查找的方式进行插入,即:每次以中值判断最后找出要插入的点,这样看起来时间也是lgN,但对于数组而言插入意味着将之后的数字依次移位,这样更加得不偿失。如果你采用链表结构来实现二分查找,可以满足快速的插入,但是由于没有了索引,仍需遍历数组得到索引,所以二分查找的插入操作复杂度级别为N。
二叉树查找(BST)
二叉树查找是在二分基础上提出,为了解决二分查找的插入问题的一种新的查找模式,这种模式通过类似链表的树结构不断地插入数据达到有序,而其查找时间也在lgN复杂度左右,代码实现较为简单。在整个有序树中存在着固定的插入和查找的模式,最后树的形状受到插入数据的先后顺序影响。正因为树的形状受到随机因素影响,在最坏的情况下,这棵树只有左子树没有右子树(或只有右子树没有左子树)导致性能甚至不如二分查找。
红黑树查找(RBT)
红黑树查找是在二叉树查找的基础上,结合了二叉树中简洁高效的查找方法,又同时是一颗保证性能平衡树。在最坏的情况下,红黑树都远好于二叉树。在平均情况下的搜索,红黑树理论上只比二分查找差一点,这是因为红黑树数据结构的特性导致,我们可以认为红黑树的查找和二分查找是相同的。在插入的复杂度比较中比二分查找好太多,红黑树的算法思路是所有有序查找中最优的算法,用便于实现的平衡树高效地完成插入和搜索操作。
红黑树定义
满足下列条件的二叉树是红黑树:
- 红链接均为左链接