2、数据结构进阶二静态查询之顺序查询

2、数据结构进阶二静态查询之顺序查询

           “我从不把安逸和快乐看作是生活的本身 -- 这种伦理基础,我叫它猪栏的理想。 -- 爱因斯坦”

           这篇我们来看下静态查询中的顺序表查询。

           我们先来看下概念,然后是代码实现。

 

1.  查找

在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找。也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元素。

查找表:用于查找的数据元素集合称为查找表。查找表由同一类型的数据元素(或记录)构成。静态查找表 若只对查找表进行如下两种操作:(1)在查找表中查看某个特定的数据元素是否在查找表中,(2)检索某个特定元素的各种属性,则称这类查找表为静态查找表。静态查找表在查找过程中查找表本身不发生变化。对静态查找表进行的查找操作称为静态查找。
    动态查找表:若在查找过程中可以将查找表中不存在的数据元素插入,或者从查找表中删除某个数据元素,则称这类查找表为动态查找表。动态查找表在查找过程中查找表可能会发生变化。对动态查找表进行的查找操作称为动态查找。
静态查找表技术:顺序查找、折半查找、索引顺序查找

2.  查找算法的衡量指标

在查找一个记录时所做的主要操作是关键字的比较,所以通常把查找过程中对关键字的平均比较次数作为衡量一个查找算法效率优劣的标准,并称平均比较次数为平均查找长度(AverageSearch Length)。平均查找长度的定义为:

              ASL=

其中,n为元素的个数; ci是查找第i 个记录需进行的比较次数;pi是查找第i个记录的概率,一般可认为查找每个记录的概率是相等的,即p1=p2=…=pn=1/n。

 

3.  顺序查找

顺序查找的思想是:将查找值顺序逐个与结点值进行比较,相等即为查找成功,否则查找失败.

顺序查找是一种最简单的查找方法。其基本思想是将查找表作为一个线性表,可以是顺序表,也可以是链表,依次用查找条件中给定的值与查找表中数据元素的关键字值进行比较,若某个记录的关键字值与给定值相等,则查找成功,返回该记录的存储位置,反之,若直到最后一个记录,其关键字值与给定值均不相等,则查找失败,返回查找失败标志。
    在顺序查找中,比较次数ci取决于所查记录在表中的位置。如查找记录R[n]时,仅需比较一次,而查找记录R[1]时,则需比较n次。一般来说,查找第i个记录的比较次数为ci=n-i+1,因此,查找成功的平均查找长度为如下图2: 

                       

在等概率情况下,即pi=1/n时,查找成功的平均查找长度为(n+1)/2。若关键字不在表中,则必须经过n+1次比较后才能确定查找失败。所以查找失败的平均查找长度为n+1。这个结果表明:顺序查找的查找长度是与记录的个数n成正比的。   

4.  代码实现

顺序表或线性表表示静态查找表,都可以用顺序查找来实现。

           此处我们也采用顺序表。

4.1      Main

输入表的个数,然后调用CreateLowShao来创建表,然后调用shuchu输出表中的数。

接着输入要查找的元素。最后调用Search_DiShao输出要查找的元素。

如下图3

 

 

4.2      CreatLowShao

根据表中总数量,挨个输入表的数据。最后设置表的总数。

 

4.3      shuchu

输出表中的数。

 

4.4      Search_DiShao

从表中寻找是否存在该数,存在则输出。

5.  源码

#include<stdio.h>

#include<stdlib.h>

typedefstruct

{

           int*elem;

           intlength;

}SSTable;

 

void CreatLowShao(SSTable&ST,intn)

{

           inta;

           ST.elem=(int*)malloc((n+2)*sizeof(int));

           if(!ST.elem)exit(0);

           printf("请输入所创建的表的数据:");

           for(inti=1;i<n+1;i++)

           {

                     scanf("%d",&a);

                     ST.elem[i]=a;

           }

           ST.length=n;

}

 

void CreatGaoShao(SSTable&ST,intn)

{

           inta;

           ST.elem=(int*)malloc((n+1)*sizeof(int));

           if(!ST.elem)exit(0);

           printf("请输入所创建的表的数据:");

           for(inti=0;i<n;i++)

           {

                     scanf("%d",&a);

                     ST.elem[i]=a;

           }

           ST.length=n;

}

 

void shuchu(SSTable&ST)

{

           printf("建立的表为:");

           for(inti=1;i<=ST.length;i++)

           {

                     printf("%5d",ST.elem[i]);

           }

           printf("\n");

}

 

int Search_DiShao(SSTable&ST,intkey)

{

           ST.elem[0]=key;

           for(inti=ST.length;i>=0;i--)

           {

                     if(ST.elem[i]==key)

                                returni;

           }

}

 

int Search_GaoShao(SSTable&ST,intkey)

{

           ST.elem[ST.length+1]=key;

           for(inti=1;i<=ST.length+1;i++)

           {

                     if(ST.elem[i]==key);

 

                     returni;

           }

}

 

void main()

{

           inti,n,key;

           SSTableST;

           printf("请输入所建立表元素的个数:");

           scanf("%d",&n);

           CreatLowShao(ST,n);

           shuchu(ST);

           printf("请输入要查找的元素:");

           scanf("%d",&key);

           i=Search_DiShao(ST,key);

           printf("元素所在位置为:%d\n",i);

 

}

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值