数据结构之“查找”-1:静态查找表

    静态查找表,一般情况下,数据是比较稳定的,很少变动的。所以,可以不考虑构造成本(即一次构造,会使用很多很多次)。

    一、顺序查找

    首先,当然是我们常用的:顺序查找。即,一个一个往后找,找到就找到。常用数据结构有线性表。当然,严蔚敏老师给了一种改进版的:从后往前查找,第0个数据是无效数据,置成要查找的key。那么,就不需要进行范围比较而只需要进行key的比较,最终肯定会找到一个位置,最后判断下位置:如果是0,那么就是没找到。(我们一般的查找,都是在某个范围之内,所以需要进行范围判断,需要比较,所以所消耗的操作也是N。但是这个算法,只需要在最后的时候进行一次位置判断。so nice!)

    另外,如果这些被查找的数据分布概率是不均匀的,那么,可以每次查找对象,如果被查找到,那么移动到第一个位置。

    顺序查找:时间复杂度是O(N)。平均查找时间长度ASL=(n+1)/2.(这里的平均查找,假设前提是概率均匀分布

    二、二分查找

    然后,再进一步:如果是有序的,那么就可以用二分查找,也叫折半查找。这种查找其实是区域性查找:因为是有序的,所以可以通过比较确定在某个范围内;如此反复,从而减小范围,最终范围是1(找到)或者(小于1,即beg>end了,范围为“负数”了)。

    当然,既然是区域,那么不一定要“二分”,书上还提到了“斐波那契”数列来分区域。书上没有讲:在确定在某个范围之内之后,如何处理。我这里猜测:可能继续用“斐波那契”数列,继续从0开始查找(即重复上面的查找,各个条件都一样,就范围变了)。

    二分查找,时间复杂度O(logN);ASL~=log(N+1)-1;(“~=”表示“约等于”);

                      如果斐波那契 数列来范围查找,时间复杂度任然是O(logN);ASL比二分好(书上没说结果),但是最坏情况比二分差。但是,这里的范围控制都是“加/减”运算,而二分查找的范围控制是“加/除”运算。

    三、静态树查找表

    在顺序查找的时候,有对不等概率的特殊处理;但是,二分查找,是通过“确定范围”来查找的,但是“确定范围”的依据是“key”。于是,就有了“静态查找树”:概率高的放上面,key小的放左边——即是二维的(我这个理解、表达对吗?)。

    静态查找树是二叉树,某棵树,“跟节点”肯定大于所有的左子树节点;“跟节点”又肯定小于所有的有子树节点。即,先序遍历,这些节点排列是有序的。

    查找很简单。但是,构造很复杂,因为如何确定最优树。最优情况,是要根据两个:能够查找到的情况下的查找时间,和查找不到的情况的查找时间。严老师说:一般,查找的大多数是存在的情况,所以可以构造“次优查找树”,即仅仅考虑查找到的情况构造查找树。构造规则就是选定跟节点(其实构造树就是构造跟节点):所有左边节点概率和L,所有右边节点概率和R,使得abs(L-R)最小。

    评:1、我不能理解这次优二叉树这么构造的道理。我只能先记住了。

           2、静态查找树是根据概率来的,那么,就是说这种表的应用前提是要知道概率?

你可能感兴趣的:(数据结构(严蔚敏))