顺序查找(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的结点,
   //成功时返回找到的结点位置,失败时返回0
   int 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较大时不宜采用顺序查找。

⑥  适用情况

对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。

时间: 2024-11-19 21:41:34

顺序查找(Sequential Search)的相关文章

Java中的查找算法之顺序查找(Sequential Search)

Java中的查找算法之顺序查找(Sequential Search) a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 找到数组中存在数据8,返回位置. 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static vo

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

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.1.htm 顺序查找(Sequential Search)     在表的组织方式中,线性表是最简单的一种.顺序查找是一种最简单的查找方法. 1.顺序查找的基本思想    基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较.若当前扫描到的结点关键字与K相等,则查找成功:若扫描结束后,仍未找到关键字等于K的结点,则

查找算法(I) 顺序查找 二分查找 索引查找

查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录. 若没有找到满足条件的记录,则返回特定值,表明查找失败:若查找到满足条件的 第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理:若需要查找到满足条件的所有记录,则可看做在多个区间内连 续查找到满足条件的第一

【Java_Base】常用查找算法:顺序查找、二分查找

顺序查找 从第一个元素开始顺序比较查找. 二分查找 二分查找前提条件: 已排序的数组中查找 二分查找的基本思想是: 首先确定该查找区间的中间点位置: int mid = (low+upper) / 2; 然后将待查找的值与中间点位置的值比较: 若相等,则查找成功并返回此位置. 若中间点位置值大于待查值,则新的查找区间是中间点位置的左边区域. 若中间点位置值小于待查值,则新的查找区间是中间点位置的右边区域. 下一次查找是针对新的查找区间进行的. 1 public class Search{ 2 p

静态查找表:顺序查找、折半查找、分块查找

引言: 除去各种线性和非线性的数据结构外.另一种在实际应用中大量使用的数据结构--查找表.查找表是由同一类型的数据元素构成的集合. 对查找表常常进行的操作有:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素.对查找表仅仅作前两种统称为"查找"的操作,则称此类查找表为静态查找表. 若在查找过程中同一时候插入查找表中不存在的数据元素,或者从查找表中删

14.查找概论与顺序查找

一.查找概论 1.查找:即根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或纪录).若表中不存在关键字等于给定值的纪录,则称查找不成功,此时查找的结果可给出一个"空"纪录或"空"指针.另外,查找表按照操作方式来分有两大种:静态查找表和动态查找表. (1)查找表(Search table):是由同一类型的数据元素(或纪录)构成的集合: (2)关键字(Key):是数据元素中某个数据项的值,又称为键值,用它可以标志一个数据元素,也可以标志一个纪录的某个数

顺序查找算法

//顺序查找法 #include <iostream> using namespace std; //第一种 int straipass(int *SqList,int key,int len) {     int i;     SqList[0]=key;     //从右往左查找第一个与key匹配记录的位置     for(i=len;SqList[i]!=key;--i);     return i;//查找成功返回位置i } //第二种 int Search(int *SqList,i

分块查找(Blocking Search)

1.定义 分块查找(Blocking Search)又称索引顺序查找.它是一种性能介于顺序查找和二分查找之间的查找方法. 2.基本思想 分块查找的基本思想是: (1)首先查找索引表 索引表是有序表,可采用二分查找或顺序查找,以确定待查的结点在哪一块. (2)然后在已确定的块中进行顺序查找 由于块内无序,只能用顺序查找. 3. 存储结构 二分查找表由"分块有序"的线性表和索引表组成. (1)"分块有序"的线性表 表R[1..n]均分为b块,前b-1块中结点个数为,第b

Java中常用的查找算法——顺序查找和二分查找

Java中常用的查找算法——顺序查找和二分查找 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static void main(String[] arg