转:线性表的查找-顺序查找

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.1.htm


顺序查找(Sequential Search)

     在表的组织方式中,线性表是最简单的一种。顺序查找是一种最简单的查找方法。

1、顺序查找的基本思想
     基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。

2、顺序查找的存储结构要求
  顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构(使用单链表作存储结构时,扫描必须从第一个结点开始)。

3、基于顺序结构的顺序查找算法
(1)类型说明
  typedef struct{
    KeyType key;
    InfoType otherinfo; //此类型依赖于应用
   }NodeType;
  typedef NodeType SeqList[n+1]; //0号单元用作哨兵

(2)具体算法
  int SeqSearch(Seqlist R,KeyType K)
    { //在顺序表R[1..n]中顺序查找关键字为K的结点,
      //成功时返回找到的结点位置,失败时返回0
      int i;
      R[0].key=K; //设置哨兵
      for(i=n;R[i].key!=K;i--); //从表后往前找
      return i; //若i为0,表示查找失败,否则R[i]是要找的结点
    } //SeqSearch
  注意:
     监视哨设在高端的顺序查找【参见练习】

(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较大时不宜采用顺序查找。

时间: 2024-10-10 14:39:09

转:线性表的查找-顺序查找的相关文章

小猪的数据结构辅助教程——2.1 线性表中的顺序表

小猪的数据结构辅助教程--2.1 线性表中的顺序表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.抽象数据类型(ADT)的概念,三要素:数据,数据元素间的关系和数据的操作 2.线性表的特点:按照一条线排列的数据集合,1对1,除了首元和尾元,其他元素都有直接前驱和直接后继 3.牢记线性表的存储结构,要理解并熟悉12个基本操作的逻辑,最好能徒手撕出代码 4.求并集,顺序表的经典例子,必须掌握! 1.抽象的数据类型 简单点说: 抽象:有点像我们面向对象语言中的类的思想,将事物

算法-符号表的实现(顺序查找和二分查找)

符号表是一种存储键值对的数据结构,支持两种操作插入和查找,就是将一组新的键值对存入表中然后根据给定的键得到对应的值,在编程语言中常用Dictionary原理类似.符号表是一种典型的抽象数据结构,在生活之中应用的场景也很多,可以根据钥匙开门,域名解析的时候的IP地址查询,字典和图书的简介和页数,key和value是密不可分的,通过key我们可以很快找到我们需要的value. 无序链表的顺序查找 主要通过Node节点存储数据,之前的博客中有关于链表的实现,详情可参考之前的博客,代码有注释就解释太多了

线性表1-顺序表

顺序表属于线性表的一种存储表现形式,在计算机内部表示为一段连续的内存空间,数组就是一种顺序表. 下面是顺序表的主要操作: 1 //顺序表的基本操作 2 template <typename Type> class Vector { 3 private: 4 //size为容量,length为当前元素个数 5 int size,length; 6 Type *data; 7 public: 8 //构造函数 9 Vector(int input_size) { 10 size=input_siz

线性表之顺序存储-顺序表

顺序表的操作 [x] 向有序顺序表插入一个元素 [x] 顺序表的冒泡排序 [x] 顺序表的删除操作 [x] 顺序表中元素的查找 [x] 顺序表的逆置 [x] 删除顺序表中的相同元素 [x] 向顺序表的指定位置插入元素 [x] 打印顺序表 顺序表的存储结构 #define maxsize 100 //存储空间的分配量 //定义顺序表数据类型 typedef struct{ int data[maxsize]; int last; //存放表中最后一个元素的下标 }sequenlist; 顺序表的冒

线性表的查找

查找基本概念 查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素而进行的工作. 线性表的查找 在查找表中.线性表查找是最简单的一种,基本的操作为顺序查找和折半查找. 顺序查找:从表的一端開始.依次将查找的keyword与给定数据库进行批对,若keyword在给定数据库中存在.则查找成功.否则当数据库从头到尾没有批对到.则查找失败. 作用范围:即使用线性表的顺序存储又适合于线性表的链式存储结构. 数据元素类型定义 typedef struct{ KeyType key. //keywor

(转载)查找一 线性表的查找

查找一 线性表的查找 目录 查找的基本概念 顺序查找 二分查找 分块查找 三种线性查找的PK 参考资料 相关阅读 查找的基本概念 什么是查找? 查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素. 查找算法的分类 若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表: 否则,称之为静态查找表. 此外,如果查找的全过程都在内存中进行,称之为内查找: 反之,如果查找过程中需要访问外存,称之为外查找. 查找算法性能比较的标准 --平均查找长度ASL(Av

查找一 线性表的查找

查找的基本概念 什么是查找? 查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素. 查找算法的分类 若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表: 否则,称之为静态查找表. 此外,如果查找的全过程都在内存中进行,称之为内查找: 反之,如果查找过程中需要访问外存,称之为外查找. 查找算法性能比较的标准 ——平均查找长度ASL(Average Search Length) 由于查找算法的主要运算是关键字的比较过程,所以通常把查找过程中对关键字需

数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找.本篇博客会给出相应查找算法的示意图以及相关代码,并且给出相应的测试用例.当然本篇博客依然会使用面向对象语言Swift来实现相应的Demo,并且会在github上进行相关Demo的分享. 查找在生活中是比较常见的,本篇博客所涉及的这几种查找都是基于线性结构的查找.也就是说我们的查找表是一个线性表,我

[Data Structure &amp; Algorithm] 线性表的查找

平均查找长度 ASL 影响查找算法好坏的主要标准 - 时间复杂度,通常用 - 平均查找长度 定义 - 为确定记录在查找表中的位置,需要和给定值进行比较的关键字的个数的期望 公式 - ASL = (查找成功时 + 查找失败时)的平均查找长度的期望 基本概念 Ps - 查找成功时的概率 Pf - 查找失败时的概率 Pi - 需要比较I次才能确定位置的记录出现的概率 n - 查找表的长度 好的算法 可以改变 - Pi 对于越小的i对应的Pi越大越好 不可以改变 - Ps和Pf 线性表上的查找 顺序表