一、查找
参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。
1、顺序表的查找
查找的定义很简单,查找到则称为是成功的,查找不到则称为是不成功的,在查找的实际应用中,引入了两种查找表:静态查找表和动态查找表;
静态查找表:(1)查询某个 “特定的” 数据元素是否存在于表中,(2)检索某个 “特定的” 数据元素的各种属性;
动态查找表:(1)若在查找过程中同时进行插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素;
所查找的特定的数据元素称为关键字key ; 在定义数据元素类型方面:
typedef int KeyType;
typedef struct {
KeyType key;
}ElemType;
typedef struct {
ElemType *elem;
int length;
}STTable;
顺序表的查找的应用范围:(1)顺序表或链表表示的静态查找表;(2)表内元素无序;
2、平均查找长度ASL
平均查找长度是评价查找算法的指标:关键字的平均比较次数 => 平均查找长度 ;
A
S
L
=
∑
i
=
1
n
p
i
c
i
ASL ={\color{red} \sum_{i=1}^{n} pi ci}
ASL=i=1∑n?pici
n = 记录的个数; pi = 查找第i个记录的概率; ci = 找到第i个记录所需要的比较次数;
顺序表的查找优缺点:
优点:算法简单,逻辑次序无要求,且不同存储结构均使用;
缺点:ASL太长,时间效率太低;
相关代码:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef int KeyType;
typedef struct {
KeyType key;
} ElemType;
typedef struct {
ElemType *elem;
int length;
} STTable;
Status InitTable(STTable &ST,int n);
Status InitTable(STTable &ST,int n) {
ST.elem = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
if(!ST.elem) return ERROR;
ST.length = 0;
int i,num;
for(i=1; i<=n; i++) {
scanf("%d",&num);
ST.elem[i].key = num;
ST.length++;
}
return OK;
}
Status Search_Seq(STTable ST,KeyType key);
Status Search_Seq(STTable ST,KeyType key) {
ST.elem[0].key = key;
int i;
for(i=ST.length; ST.elem[i].key != key; --i);
return i;
}
int main(void) {
STTable ST;
int n,key,i;
scanf("%d",&n);
InitTable(ST,n);
scanf("%d",&key);
i = Search_Seq(ST,key);
if(i != 0) printf("%d\n",i);
else printf("查无此项\n");
return 0;
}
|