查找算法最强总结及其算法实现( 二 )


5.树表查找
5.1 最简单的树表查找算法——二叉树查找算法
基本思想:
这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树 。
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:
1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3)任意节点的左、右子树也分别为二叉查找树 。
二叉查找树性质:
对二叉查找树进行中序遍历,即可得到有序的数列 。
有关二叉查找树的查找、插入、删除等操作的详细讲解,请移步浅谈算法和数据结构: 七 二叉查找树
复杂度分析:
它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度 。原因在于插入和删除元素的时候,树没有保持平衡(比如,我们查找上图(b)中的“93”,我们需要进行n次查找操作) 。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡查找树设计的初衷 。
基于二叉查找树进行优化,进而可以得到其他的树表查找算法,如平衡树、红黑树等高效算法 。
5.2 平衡查找树之2-3查找树(2-3 Tree)
https://riteme.github.io/blog/2016-3-12/2-3-tree-and-red-black-tree.html
2-3查找树定义:和二叉树不一样,2-3树运行每个节点保存1个或者两个的值 。对于普通的2节点(2-node),他保存1个key和左右两个自己点 。对应3节点(3-node),保存两个Key,2-3查找树的定义如下:
1)要么为空,要么:
2)对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key要小,右节点也是一个2-3节点,所有的值比key要大 。
3)对于3节点,该节点保存两个key及对应value,以及三个指向左中右的节点 。左节点也是一个2-3节点,所有的值均比两个key中的最小的key还要小;中间节点也是一个2-3节点,中间节点的key值在两个跟节点key值之间;右节点也是一个2-3节点,节点的所有key值比两个key中的最大的key还要大 。
2-3查找树的性质:
1)如果中序遍历2-3查找树,就可以得到排好序的序列;
2)在一个完全平衡的2-3查找树中,根节点到每一个为空节点的距离都相同 。(这也是平衡树中“平衡”一词的概念,根节点到叶节点的最长距离对应于查找算法的最坏情况,而平衡树中根节点到叶节点的距离都一样,最坏情况也具有对数复杂度 。)
复杂度分析:
2-3树的查找效率与树的高度是息息相关的 。
距离来说,对于1百万个节点的2-3树,树的高度为12-20之间,对于10亿个节点的2-3树,树的高度为18-30之间 。
对于插入来说,只需要常数次操作即可完成,因为他只需要修改与该节点关联的节点即可,不需要检查其他节点,所以效率和查找类似 。

查找算法最强总结及其算法实现

文章插图
 
这里写图片描述
5.3 平衡查找树之红黑树(Red-Black Tree)
但是2-3树实现起来比较复杂,于是就有了一种简单实现2-3树的数据结构,即红黑树(Red-Black Tree) 。
红黑树的定义:
红黑树是一种具有红色和黑色链接的平衡查找树,同时满足:
  • 红色节点向左倾斜
  • 一个节点不可能有两个红色链接
  • 整个树完全黑色平衡,即从根节点到所以叶子结点的路径上,黑色链接的个数都相同 。
红黑树的性质:整个树完全黑色平衡,即从根节点到所以叶子结点的路径上,黑色链接的个数都相同(2-3树的第2)性质,从根节点到叶子节点的距离都相等) 。
查找算法最强总结及其算法实现

文章插图
 
这里写图片描述
复杂度分析:
【查找算法最强总结及其算法实现】最坏的情况就是,红黑树中除了最左侧路径全部是由3-node节点组成,即红黑相间的路径长度是全黑路径长度的2倍 。
下图是一个典型的红黑树,从中可以看到最长的路径(红黑相间的路径)是最短路径的2倍:
查找算法最强总结及其算法实现

文章插图
 
这里写图片描述
红黑树这种数据结构应用十分广泛,在多种编程语言中被用作符号表的实现,如:


推荐阅读