一、基本定义
1.关键字:是数据元素中摸个数据项的值,又称键值,他可以标识一个数据元素
2.静态查找表:只作查找操作的查找表
3.动态查找表:在查找中插入或删除元素
二、顺序表查找(线性查找)
1.过程:从表的第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值相等,则查找成功。
2.算法:a为数组,n为要查找的数组个数,key为关键字
int Sequential_Search(int *a,int n, int ket)
{
int i;
for(i=0;i<n;i++)
{ if(a[i]==key)
return i;
}
return 0;
)
3.优化 (有哨兵顺序查找)
以上算法,每次循环都需要判断i是否越界,可以设置一个哨兵,可以解决不需要每次i与 n作比较
int Sequential_Search2(int *a,int n,int key)
{
int i;
a[0]=key;
i=n; //循环从尾部开始
while(a[i]!=k){
i--;}
return i; //返回0则说明查找失败
)
4.复杂度
查找的最好情况时第一个位置就找到 复杂度:O(1)
最坏的情况需要你比较n次 复杂度 O(n)
最终时间复杂度O(n)
三、有序表查找
.折半查找
1.前提:线性表中的关键码有序,线性表采用顺序存储
2.算法:取中间值作为比较对象,若给定值与中间记录相等则查找成功,若给定值小于中间记录,则在中间记录的左半区继续查找,若大于中间记录则在右边继续查找
int Binary_Search(int *a,int n, int key)
{
int mid,low,high;
int low=0;
int high=n;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]<key)
low=mid+1;
else if (a[mid]>key)
high=mid-1;
else
return mid;
}
return 0;
}
3.复杂度
由二叉树性质的值,具有n个结点的完全二叉树深度为(logn)向下取整+1,折半查找虽然不是完全二叉树,但最坏情况查找次数仍然是(logn)向下取整+1
时间复杂度O(logn)
四、线性索引查找
1.索引就是把一个关键字与它对应的记录相关联的过程
线性索引就是讲索引集合组织为线性结构,也成索引表。主要介绍三种:稠密索引、分块索引和倒排索引
2.稠密索引
在线性索引中,将数据集中的每个记录对应一个索引项,索引项一定要按照关键码有序排列。可以用到折半。插值、斐波那契等有序查找算法。
3.分块索引
块内无序,块间有序
定义分块索引的索引结构分三个数据项:
最大关键码:存储每一块中的最大关键字
存储块中的记录个数,以便于循环利用
用于指向块首数据元素的指针,便于开始对这一块进行遍历
平均查找长度:将n个记录分成m块,每个块中有t条记录 n=m*t,m=n/t
块间查找长度(m+1)/2,块内查找长度(t+1)/2
所以L=(m+1)/2+(t+1)/2=(m+t)/2+1=(n/t+t)/2+1
最佳情况是m=t,L=t+1=sqrt(n)+1
分块索引的效率比顺序查找高,但是低于折半查找