顺序查找(Sequential Search)
1、定义
顺序查找又叫线性查找,是最基本的查找技术。
2、基本思想
从表的一端开始(第一个或最后一个记录),顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。
3、存储结构
顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构(使用单链表作存储结构时,扫描必须从第一个结点开始)。
注意:单链表为什么从第一个扫描,而不是最后一个,这与其存储结构有关,单链表名字即表示第一个第一个结点的地址,而不是最后一个结点的地址。
4、顺序查找算法
(1)类型说明
typedef struct{KeyType key;InfoType otherinfo; //此类型依赖于应用}NodeType;typedef NodeType SeqList[n+1]; //0号单元用作哨兵
(2)具体算法
/*顺序查找,参数说明:a——数组;n——要查找的数组个数;key——要查找的关键字
*/
int SeqSearch(int *a,int n,int key)
//这里是指针引用
{ int i; for(i=1;i<=n;i++){//缺陷:每次循环都需要对i是否越界,即是否小于等于n做判断if(a[i]=key)return i;}return 0; }
上述操作中,每次循环都需要对i是否越界,即是否小于等于n做判断,我们可以设置一个哨兵,不需要每次i与n作比较,改进方案如下:
/*有哨兵的顺序查找*/
int SeqSearch(int *a,int n,int key)
//这里是指针引用
{ int i; a[0]=key;/*设置a[0]为关键字值,我们称之为“哨兵”,当然也可以设置最后一个元素为“哨兵”*/int n;/*循环从数组尾部开始*/while(a[i]!=key){i--;}return i; /*返回0说明查找失败*/}
当然参数也可以如下设置,把元素个数放在数据结构体中定义:
int SeqSearch(Seqlist R,KeyType K)
{ //在顺序表R[1..n]中顺序查找关键字为K的结点,//成功时返回找到的结点位置,失败时返回0int i;R[0].key=K; //设置哨兵for(i=n;R[i].key!=K;i--); //从表后往前找return i; //若i为0,表示查找失败,否则R[i]是要找的结点
}
3、算法分析
① 算法中监视哨R[0]的作用
为了在for循环中省去判定防止下标越界的条件i≥1,从而节省比较的时间。
② 成功时的顺序查找的平均查找长度:
在等概率情况下,pi=1/n(1≤i≤n),故成功的平均查找长度为
(n+…+2+1)/n=(n+1)/2
即查找成功时的平均比较次数约为表长的一半。
若K值不在表中,则须进行n+1次比较之后才能确定查找失败。
③ 表中各结点的查找概率并不相等的ASL
【例】在由全校学生的病历档案组成的线性表中,体弱多病同学的病历的查找概率必然高于健康同学的病历,由于上式的ASLsq在pn≥pn-1≥…≥p2≥p1时达到最小值。
若事先知道表中各结点的查找概率不相等和它们的分布情况,则应将表中结点按查找概率由小到大地存放,以便提高顺序查找的效率。
为了提高查找效率,对算法SeqSearch做如下修改:每当查找成功,就将找到的结点和其后继(若存在)结点交换。这样,使得查找概率大的结点在查找过程中不断往后移,便于在以后的查找中减少比较次数。
④ 顺序查找的优点
算法简单,且对表的结构无任何要求,无论是用向量还是用链表来存放结点,也无论结点之间是否按关键字有序,它都同样适用。
⑤ 顺序查找的缺点
查找效率低,因此,当n较大时不宜采用顺序查找。
⑥ 适用情况
对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。
转载于:https://www.cnblogs.com/yedushusheng/p/5524175.html
顺序查找(Sequential Search)相关推荐
- 顺序查找(Linear Search)
顺序查找,也叫线性查找,从列表第一个元素开始,顺序进行搜索, 直到找到元素或搜索到列表最后一个元素为. def linear_search(li,value):for i,v in enumerate ...
- (王道408考研数据结构)第七章查找-第二节1:顺序查找及其优化
文章目录 一:顺序查找基本思想 二:效率分析 三:顺序查找优化(针对查找表为有序表) 四:顺序查找优化(针对查找概率不相等) 一:顺序查找基本思想 顺序查找(Sequential Search):又叫 ...
- 顺序查找(线性表的查找)
顺序查找 顺序查找(Sequential Search)的查找过程为:从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功:反之,若扫描整个表后,仍未找到关键 ...
- 经典算法之顺序查找(Sequential Search)
活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 文章目录 1. 前言 2. 算法基本概念 4. 顺序查找 4.1 伪代码 4.2 ...
- 经典算法之顺序查找法
活动地址:CSDN21天学习挑战赛 前言 已经进入八月份了,暑假也正式进入倒计时.本人前段时间在学习前端中移动端部分的微信小程序开发知识,也算勉勉强强能入门(因为没有前端三件套的基础,前端居然是从小程 ...
- 简述java实现冒泡排序和顺序查找
目录 一.冒泡排序(Bubble Sort) 程序思路: 化繁为简: 先死后活: 代码效果: 二.顺序查找 程序分析: 代码实现: 代码效果: 一.冒泡排序(Bubble Sort) 也是一种简单直观 ...
- 顺序查找(算法学习)
活动地址:CSDN21天学习挑战赛 学习日记 一,顺序查找 1,什么是查找 查找就是从从某个数据结构中找出指定条件的元素,找到满足的条件元素便表示查找成功,反之代表查找失败,查找的方式也会根据 ...
- 14.查找概论与顺序查找
一.查找概论 1.查找:即依据给定的某个值,在查找表中确定一个其keyword等于给定值的数据元素(或纪录).若表中不存在keyword等于给定值的纪录.则称查找不成功,此时查找的结果可给出一个&qu ...
- 顺序查找(c/c++)
顺序查找 顺序查找分为对无序表和有序表的查找: 对无序表的查找算法如下: int search(int* array, int num,int key)//数组下标从0开始 {int i=num;wh ...
最新文章
- dwarf tower
- Microsoft office 2007 word PPT 转pdf的插件(转)
- js变量后面加问号是什么_js没那么简单(1)-- 执行上下文
- 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
- 工程勘察设计收费标准2002修订版_黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计招标...
- Google Guava库必需品
- TSQL中实现ORACLE的多列IN 多列匹配。
- DBA邀请函丨数据库大咖讲坛来深圳啦!线下沙龙+线上直播,共享技术盛会!
- android修改自动背光,Android LCD和键盘 背光亮度设置
- 多分类f1分数_机器学习之分类模型评估总结
- 【原创】在Windows 环境下利用SVN和Apache以及Ankh配置源代码管理服务
- 被脱库咋办?KMS 给你解决方案!
- 很好用的数据库设计工具PDMan,强力推荐
- 2021年焊工(初级)报名考试及焊工(初级)新版试题
- html5制作星星闪烁和制作时钟
- cad断点快捷键_CAD打断(BREAK)命令的使用技巧
- 养不起真猫,就用代码吸猫-Unity粒子实现画猫咪
- 向日葵远程桌面连接教程(Windows与Linux互连)
- python猜字游戏猜三次_python 猜字游戏
- ThinkPHP根据时间显示不同的问候语
热门文章
- 基础总结篇之中的一个:Activity生命周期
- iOS 证书与签名 解惑详解
- session的存储方式
- 主成分分析(PCA)原理详解 2016/12/17 · IT技术 · 主成分分析, 数学 分享到: 21 原文出处: 中科春哥 一、PCA简介 1. 相关背景 主成分分析(Principa
- 叠数的加法与字符串 RUNOOB python练习题 18
- Centos用户和用户组管理
- log日志轮转--logrotate
- JNI通过线程c回调java层的函数
- Apache Shiro 简介
- Ubuntu 12.04 修改/etc/resolv.conf重启后还原成修改前状态解决办法