数据结构与算法--线性表查找

回顾

  • 最小生成树:权值之和最小的生成树。
  • 构造最小生成树的算法:Prim算法和Kruskal算法。
  • 图的最短路径:包括单源点最短路径和每对顶点间的最短路径。
  • 狄杰斯特拉(Dijkstra)算法:用于求解单源点最短路径。

提要

  • 查找的概念与效率。
  • 顺序表的查找。
  • 有序表的查找。
  • 索引表的查找。
  • 查找方法的比较。

1.查找的基本概念

  • 查找表:由具有相同特性的数据元素构成的集合。

    • 由一些具有相同特性的数据元素(或记录)构成的集合。
    • 查找表:可能是表或者文件。
    • 关键字:唯一标识数据元素的数据项。
  • 查找:根据给定值,在查找表中确定关键字等于给定值的数据元素。

    • 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。
    • 查找:在某种数据结构中找出满足给定条件的元素。
    • 查找又称为检索。
    • 查找结果:成功、失败。
1.1 查找的分类
  1. 静态查找:顺序表、有序表、索引表。
  2. 动态查找:二叉排序树。
    • 若在查找的同时对表做修改操作(如插入或删除),则相应的表称之为动态查找表;否则称之为静态查找表。
  3. 散列(哈希)查找:构造查找表时,给集合中的数据元素人为地加上某种确定的约束关系,以提高查找效率。
示例

在这里插入图片描述

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.三种查找方法的比较

  • 顺序查找、折半查找、索引查找的优缺点和适用范围。
  • 在这里插入图片描述

总结

  • 顺序表、有序表和索引表的查找方法。
  • 各种查找方法的优点、缺点和适用范围。

猜你喜欢

转载自blog.csdn.net/wumingzei/article/details/141265260