数据结构——三十九、顺序查找(王道408)

文章目录

前言

本文介绍了顺序查找算法的基本实现与优化方法。顺序查找是一种线性查找算法,通过逐一比较元素实现查找。文章首先给出了顺序查找的一般实现代码,然后介绍了哨兵机制优化方法,该方式通过减少越界判断提高效率。对于有序表的情况,可以通过提前终止查找进一步优化性能。此外,还讨论了根据元素被查概率调整存储位置的优化策略,虽然能提高查找成功效率,但会影响查找失败时的性能。最后指出顺序查找的时间复杂度始终为O(n)。本文通过算法思想、代码实现、效率分析和优化策略,全面介绍了顺序查找这一基础算法。

一.顺序查找的算法思想

  • 顺序查找,又叫"线性查找",通常用于线性表。
  • 算法思想:从头到脚挨个找(或者反过来也OK)

二.顺序查找的实现

1.一般实现

1.实现思路

  • 从前往后依次寻找与查找目标关键字相同的元素

2.实现代码

c 复制代码
typedef struct{	//查找表的数据结构(顺序表)
	Element *elem;	//动态数组基址
	int TableLen;	//表的长度
}SSTable;
//顺序查找
int Search_Seq(SSTable ST, ElemType key){
	int i;
	for(i=0; i<ST. TableLen && ST. elem[i]!=key; ++i);
	//查找成功,则返回元素下标;查找失败,则返回-1
	return i==ST. TableLen?-1:i;
}

2.哨兵实现顺序查找

1.实现思路

  • 把0号位置给空出来,就是说我们实际的那些数据是从1这个位置开始存放的
  • 当我们要查找某一个关键字的时候,会把这个关键字放到0号位置这个地方(哨兵)
  • 然后接下来我们会让指针从最后一个位置开始往前扫描,如果当前指向了这个元素的值和我们的目标不一样,那么我们就会向前一直往前走

2.代码

c 复制代码
typedef struct{//查找表的数据结构(顺序表)
	ElementType *elem; //动态数组基址
	int TableLen; //表的长度
}SSTable;
//顺序查找
int Search_Seq(SSTable ST, ElementType key){
	ST.elem[0]=key; //"哨兵"
	int i;
	for(i=ST.TableLen; ST.elem[i]!=key;--i); //从后往前找
	return i; //查找成功,则返回元素下标;查找失败,则返回0
}

3.优点

  • 在每一轮for循环的时候,我们只需要判断当前指向的元素和我们要找的那个关键字是否相等,而不用判断是否已经遍历完所有元素
  • 优点:无需判断是否越界,效率更高

4.执行效率

  • A S L = ∑ i = 1 n P i C i ASL=∑_{i=1}^{n}PᵢCᵢ ASL=∑i=1nPiCi
  • 查找成功的情况: A S L 成功 = 1 + 2 + 3 + ⋯ + n n = n + 1 2 ASL_\text{成功}=\frac{1+2+3+\cdots+n}{n}=\frac{n+1}{2} ASL成功=n1+2+3+⋯+n=2n+1
  • 查找失败的情况: A S L 失败 = n + 1 ASL_\text{失败}=n+1 ASL失败=n+1

三.顺序查找的优化(对有序表)

1.思路

  • 只需要查找到我们大于21的值就不必再往后查找

  • 有序表的查找判定树

2.执行效率

1.执行失败

  • 因为有n加一个这样的失败节点(查找判定树中的左孩子和最后一个节点的右孩子),共有n+1种查找失败的情况
  • 假定说出现这n+1种情况的概率都是相等的,所以如果我们想要查找的那个关键字的值落在了第一个区间内,那么其实总共只需要对比一次关键字就可以了,而发生这种情况的概率是 1 n + 1 \frac{1}{n+1} n+11
  • 以此类推,最终查找失败的平均查找长度为: A S L 失败 = 1 + 2 + 3 + ... + n + n n + 1 = n 2 + n n + 1 ASL_\text{失败}=\frac{1+2+3+\dotsc+n+n}{n+1}=\frac{n}{2}+\frac{n}{n+1} ASL失败=n+11+2+3+...+n+n=2n+n+1n
    最后我们加了两个n,原因在于最下面的这两种失败情况(43的左右孩子),肯定都是需要把前面的n个元素都全部给对比一遍,所以这两种失败的情况都是要对比n次关键字

2.优势

  • 很显然,对比普通的查找方法,它的执行失败的ASL更少

3.用查找判定树分析ASL

  • 一个成功结点的查找长度 = 自身所在层数
  • 一个失败结点的查找长度 =其父节点所在层数
  • 默认情况下,各种失败情况或成功情况都等概率发生

四.顺序查找的优化(被查概率不相等)

  • 把被查找的概率更大的这些关键字放到更靠前的位置
  • 这么做可以使得当我们在查找成功的情况下,平均查找长度能够更进一步的缩短
  • 这样优化就会导致关键字的值又变成了乱序,这样做可以提高查找成功的平均查找长度,但是对于查找失败的情况又只能从头扫到尾

五.知识回顾与重要考点

  • 只要你采用的是顺序查找的这种基本策略,算法时间复杂度肯定都是O(n)这样的一个数量级

结语

最近被学校的琐事缠住了,只能暂时停更😖
如果想查看更多章节,请点击:一、数据结构专栏导航页

相关推荐
知识浅谈4 小时前
DeepSeek V4 和 GPT-5.5 在同一天发布了??我也很懵,但对比完我悟了
算法
DeepModel4 小时前
通俗易懂讲透 Q-Learning:从零学会强化学习核心算法
人工智能·学习·算法·机器学习
田梓燊4 小时前
力扣:19.删除链表的倒数第 N 个结点
算法·leetcode·链表
handler015 小时前
从零实现自动化构建:Linux Makefile 完全指南
linux·c++·笔记·学习·自动化
安小牛6 小时前
Android 开发汉字转带声调的拼音
android·java·学习·android studio
简简单单做算法6 小时前
基于GA遗传优化双BP神经网络的时间序列预测算法matlab仿真
神经网络·算法·matlab·时间序列预测·双bp神经网络
阿豪学编程6 小时前
面试题map/unordered相关
数据结构
guygg886 小时前
利用遗传算法解决列车优化运行问题的MATLAB实现
开发语言·算法·matlab
武藤一雄6 小时前
19个核心算法(C#版)
数据结构·windows·算法·c#·排序算法·.net·.netcore
sali-tec6 小时前
C# 基于OpenCv的视觉工作流-章52-交点查找
图像处理·人工智能·opencv·算法·计算机视觉