文章目录
回顾
- 最小生成树:权值之和最小的生成树。
- 构造最小生成树的算法:Prim算法和Kruskal算法。
- 图的最短路径:包括单源点最短路径和每对顶点间的最短路径。
- 狄杰斯特拉(Dijkstra)算法:用于求解单源点最短路径。
提要
- 查找的概念与效率。
- 顺序表的查找。
- 有序表的查找。
- 索引表的查找。
- 查找方法的比较。
1.查找的基本概念
-
查找表:由具有相同特性的数据元素构成的集合。
- 由一些具有相同特性的数据元素(或记录)构成的集合。
- 查找表:可能是表或者文件。
- 关键字:唯一标识数据元素的数据项。
-
查找:根据给定值,在查找表中确定关键字等于给定值的数据元素。
- 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。
- 查找:在某种数据结构中找出满足给定条件的元素。
- 查找又称为检索。
- 查找结果:成功、失败。
1.1 查找的分类
- 静态查找:顺序表、有序表、索引表。
- 动态查找:二叉排序树。
- 若在查找的同时对表做修改操作(如插入或删除),则相应的表称之为动态查找表;否则称之为静态查找表。
- 散列(哈希)查找:构造查找表时,给集合中的数据元素人为地加上某种确定的约束关系,以提高查找效率。
示例
1.2 查找的效率
- 平均查找长度(ASL):查找过程中比较次数的平均值。
2.顺序表查找
- 以顺序表作为存储结构。
- 从表的一端开始,顺序扫描顺序表,与给定值相比较。
- 若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。
2.1 顺序查找的实现
- 顺序查找算法的C语言实现。
- 注:每一步都要检测是否查找完毕。
最后返回时,需判断成功还是失败。
2.2 顺序查找的改进
- 使用监视哨简化查找过程。
- 注:不用检测是否查找完毕。
成功与失败共用一条返回语句。
2.3 顺序查找的效率
-
查找成功和失败时的平均查找长度。
-
查找成功时的平均查找长度:
-
查找到表中第i个记录R[i-1]时,需比较i次。因此成功时的顺序查找的平均查找长度为:
-
查找成功时的平均比较次数约为表长的一半 。
-
查找失败时需要和表中所有元素都比较一次,所以平均查找长度为:n。
3.有序表查找
- 折半查找:也称为二分查找,要求线性表已按关键字值有序排列。
3.1 有序表查找的过程
- 确定待查找区间,逐步缩小区间直至找到记录或查找失败。
- 查找方法:
- 先确定待查记录所在区间,然后逐步缩小区间直至找到该记录,或者直到查找区间无法确定时也没有找到为止。
- 查找区间每次缩小约一半。
- 确定待查找区间R的中间位置mid;
- 将待查找关键字k与R[mid]进行比较:
- 若k = R[mid],则查找成功;
- 若k < R[mid],则在R的左半子区间继续查找;
- 若k > R[mid],则在R的右半子区间继续查找。
- 直至找到或查找区间的上界小于下界为止(查找失败)。
3.2 有序表折半查找示例
- 查找特定元素的过程示例。
3.3 有序表折半查找的实现
- 折半查找算法的C语言实现。
3.4 有序表折半查找的判定树
- 使用二叉树描述折半查找过程。
- 把当前查找区间的中间位置上的记录作为根;
- 左子表和右子表中的记录分别作为根的左子树和右子树。
- 判定树的形态只与元素个数n有关,与表中关键字的取值无关。
示例:对于给定11个数据元素的有序表: {2,3,10,15,20,25,28,29,30,35,40},采用折半查找的方法,结合它所对应的判定树,回答以下问题。
查找20,将依次与25、10、15、20比较,查找成功,共比较4次。
若查找表中每个元素的查找概率相同,求查找成功和查找失败时的平均查找长度。
成功:找到图中某个圆形结点
失败:找到图中某个#
4.索引查找 (分块查找)
- 要求记录按关键字分块有序。
- 索引表:包含每个分块的最大关键字和起始地址。
- 分块有序:将顺序表分为多个分块,后一分块的最小关键字要大于前一分块的最大关键字。
- 在建立这个"分块有序"的顺序表(主表)的同时,另建一个"索引表"(表中元素为"索引项"的有序表)。每个索引项由各分块的"最大关键字"和分块的"起始地址"组成。
- 由主表和相应的索引表构成一个"索引顺序表"。
4.1 索引查找特点
- 分块内部不要求有序,索引表要求有序。
- 索引项包括:
- 索引值(该分块最大关键字的值)
- 该分块的起始地址
- 分块长度(可选)
- 索引值与关键字具有相同的数据类型。
4.2 索引查找过程
- 在索引表中确定分块,然后在分块内顺序查找。
5.三种查找方法的比较
- 顺序查找、折半查找、索引查找的优缺点和适用范围。
总结
- 顺序表、有序表和索引表的查找方法。
- 各种查找方法的优点、缺点和适用范围。