数据结构之查找一静态查找

今天将数据结构的查找章节的知识点总结一下,以前在课堂上没有好好听,所以现在不得不将这些基础拿出来再预习—学习—复习,哎,苦逼的程序媛。。。。。

下面进入正题。

在非数值运算问题上,数据存数量一般很大,为了在大量数据中找到某些值,需要用到查找技术,为了提高查找效率,需要对一些数据进行排序。查找和排序的数据处理量几乎占到总处理量的80%以上,所以查找和排序的有效性直接影响到基本算法的有效性,因而查找和排序时很重要的处理技术。


对于表的查找,有两种情况:

一种是静态查找:在查找过程中,只是对数据元素进行查找;

一种是动态查找:在查找的同时,插入找不到的元素,或从查找表中删除已经查到的某个元素,即允许表中的元素变化。


查找的基本方法可以分为两类:比较式查找和计算式查找

比较式查找又分为:基于线性表的查找和基于树的查找

计算式查找又称为哈希查找


基于线性表的查找具体又可以分为:顺序查找、折半查找和分块查找


顺序查找的特点是:用所给关键字与线性表中的每个元素逐个进行比较(此时的比较是从列表中最后一个元素开始的,逐一往前找,此时哨兵为r[0],循环条件从1开始到n;当然,循环条件也可以逆序,此时的哨兵则为r[n+1])。注:设置哨兵位,是为了防止下标越界。

存储结构通常为顺序结构,也称为链式结构。

该方法的平均查找长度为:ASL=(n+1)/2


折半查找:又称为二分查找法,对于待查找的列表有两个要求:

1、必须采用顺序存储结构

2、必须按照关键大小有序排列

该方法的平均查找长度为:ASL=log2(n+1) -1

特点是:

优点:比较次数少,查找速度快,平均性能好

缺点:要求对于待查表为有序表,且插入和删除比较困难

该方法的适用情况:适用于不经常变动而查找频繁的有序列表

折半查找可以用二叉判定树来表示:

此时的平均查找长度是:ASL=每个结点的层次数之和 / 结点总数



分块查找

思想:将列表分为若干个块(子表),块的长度均匀,每块中元素任意排列,快内无序,块间有序。构造一个索引表,其中每一个索引项对应一个块(块内的最大关键字)并记录每块的起始位置,以及每块中的最大关键字(或者最小关键字),索引表按关键字有序排列

该方法的平均查找长度是由两部分组成的,即查找索引表时的平均查找长度为L1,与在相应块内进行顺序查找的平均查找长度为L2,则有

ASL=L1+L2

若用顺序查找法确定待查元素所在的块,则有:

ASL=L1+L2=(b+s)/ 2 +1(注:b:表分的块数,s:块内的元素数)

若用折半查找法确定待查元素所在的块,则有:

ASL=log2(n/s + 1) +s/2(注:n:表的长度)


你可能感兴趣的:(数据结构,查找)