zoukankan      html  css  js  c++  java
  • 转:线性表的查找-顺序查找

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

     1 #include "stdafx.h"
     2 #include <iostream>
     3 typedef int KeyType;
     4 typedef int InfoType;    //此类型依赖于应用
     5 typedef struct tagNodeType
     6 {
     7     KeyType key;
     8     InfoType otherinfo;  //此类型依赖于应用
     9 }NodeType;
    10 
    11 static int n = 6;
    12 typedef NodeType SeqList[]; //0号单元用作哨兵
    13 
    14 int SeqSearch(SeqList R, KeyType K)
    15 {
    16     //在顺序表R[1..n]中顺序查找关键字为K的结点,成功时返回找到的结点位置,失败时返回0
    17     int index;
    18     R[0].key = K;                                //设置哨兵
    19     for (index = n;R[index].key != K;--index);             //从表后往前找
    20     return index;                                    //若i为0,表示查找失败,否则R[i]是要找的结点
    21 }
    22 
    23 int _tmain(int argc, _TCHAR* argv[])
    24 {
    25     SeqList array = {{0,0}, {34,0}, {45,0}, {90,0}, {27,0}, {88,0}}; // 注意array[0]用作设置哨兵,有效数据从array[1]起始。
    26     int result = SeqSearch(array, 27);
    27     system("pause");
    28     return 0;
    29 }

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

  • 相关阅读:
    Java入门——数组和方法
    Java入门——选择与循环语句
    Java入门——面向对象基础
    十天学会Oracle数据库(Day2)
    Java入门——理解面向对象:UML设计
    十天学会Oracle数据库(Day1)
    Codeforces Round #482 (Div. 2) :B
    Codeforces Round #482 (Div. 2) :C
    Codeforces Round #490 (Div. 3) :F. Cards and Joy(组合背包)
    POJ-2155:Matrix(二维树状数祖)
  • 原文地址:https://www.cnblogs.com/kira2will/p/3964957.html
Copyright © 2011-2022 走看看