C语言数据结构基础学习笔记——静态查找表

时间:2021-08-21 12:19:54

查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找。

查找表:用于查找的数据集合称为查找表,一般有以下操作:①查找是否在表中;②查找属性;③进行操作。

查找表又分为:

①静态查找表:只可以进行之前的①②操作,例如顺序查找、折半查找;

②动态查找表:可以进行以上①②③所有操作,例如二叉排序树、二叉平衡树。

关键字:数据元素中某个可以唯一标识该元素的数据项。

平均查找长度(ASL):在查找的过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度则是所有查找过程中进行关键字的比较次数的平均值。

顺序查找:也叫线性查找

可以从数组头部向后遍历:

int Search1(int a[],int n,int key){
for(int i=;i<=n;i++){ //注意从1开始
if(a[i]==key) return i;
}
return o;
}

也可以从尾部向前遍历:

int Search1(int a[],int n,int key){
int i=n;
a[]=key; //设置哨兵
while(a[i]!=key){ //如果不是要找的元素
i--; //从后往前找
}
return i; //如果查找失败也会返回0
}

折半查找:仅适用有序的线性表

int Binary_Search(SeqList L,ElemType key,int n){       //L是一个有序顺序表,key是代查找的关键字,n是L的长度
int low=,high=n-,mid; //low,high,mid分别代表当前查找段的首位下标,末位下表和中间下标
while(low<=high){ //只要low与high不汇合,就表示查找表没有扫描完
mid=(low+high)/; //中间下标为low和high之和除以2
if(L.elem[mid]==key) return mid; //查找成功
else if(L.elem[mid]>key) high=mid-; //中间值比key大,向下查找
else low=mid+; //中间值比key小,向上查找
}
return -; //未能找到
}

分块查找:是折半查找与顺序查找的结合,将一个线性表分块,块中存储顺序任意,但要保证前一块的最大值小于后一块的最小值,同时,需要额外建立一个索引表来存储索引,每一个索引对应表中的每一块。

分块查找的思想:

①确定带查找值在哪一块(折半查找);

②在确定的块中查找待查找值(顺序查找)。

分块查找的定义:

#define MaxSize 50
typedef struct{
int key; //这个索引块中最大关键字的值
int low,num; //存储索引块中第一个元素的下标和块的长度
}indexElem; //索引块结构
indexElem index[MaxSize];