Jasmineyaoyao 2020-05-11
静态查找
数据集合稳定,不需要添加,删除元素的查找
对于静态查找:可以用线性表结构组织数据,这样便可使用顺序查找算法,如果再对关键字进行排序,则可使用折半查找法或斐波那契查找法等来提高效率
动态查找
数据集合在查找的过程中需要同时添加或删除元素的查找
对于动态查找:可考虑使用二叉排序树的查找技术,另外还可使用散列表结构来解决一些查找问题
顺序查找:
从第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值进行比较
//顺序查找,a为要查找的数组;n为数组长度,key为查找的关键字
int Sq_Search(int *a,int n,int key){
int i;
for(i=0;i<=n;i++){
if(a[i]==key){
return i;
}
}
return 0;
}由于每次循环都要判断两次,所以可以考虑添加一个“哨兵”来承担监视越界的问题省去一次判断,这样效率就可提高一倍;
//顺序查找,a为要查找的数组;n为数组长度,key为查找的关键字
int Sq_Search(int *a,int n,int key){
int i=n-1;
a[0]=key;
while(a[i]!=key)
i--;
return i;
}折半查找法
二分法搜索:确定待查找范围,缩小范围【O(Log?n)】
差值查找法
原理:按照数据分布的数据差值比例,按这个比例来决定下一次查找位(关键是差值要按比例分布)
按比例查找:与折半查找法相似(只不过将二分改为了按比例查而已)
例如:再字典中查找apple不会用折半查找法,而是差值查找法
int bin_search(int a[],int n,int key){
int low=0,high=n-1,mid;
while(low<=high){
printf("循环\n");
//中心思路是:key下标/查找范围≈key/范围边缘两值的差;根据这种思想,不断缩短范围直到查找到key
mid=low+(key-a[low])/(a[high]-a[low])*(high-low);
if(a[mid]==key)
return mid;
else if(a[mid]<key)//说明key在mid的右边
low=mid+1;
else//说明key在mid左边
high=mid-1;
}
return -1;
}斐波那契查找
斐波那契数列(F[k]):1,1,2,3,5,8,13,21,34,...(前后两个数比重逐渐接近:0.618)
所以利用斐波那契把差值查找中的比例改为不断接近0.618的比例就叫斐波那契查找法;

#define MAXSIZE 20
int bin_search(int a[],int n,int key){
int low=0,high,mid;
int i=1,j=1,k=2;
int f[MAXSIZE]={1,1};
while(f[k]<n&&j<MAXSIZE){
k++;
f[k]=f[i]+f[j];
i=f[j];
j=f[k];
}
high=f[k];
while(low<=high){
printf("循环\n");
mid=f[k-1];
if(a[mid]==key)
return mid;
else if(a[mid]<key){//说明key在mid的右边
low=mid+1;
k-=2;
mid=f[k-1];
}else{//说明key在mid左边
high=mid-1;
k-=1;
mid=f[k-1];
}
}
return -1;
}线性索引查找
.
分块索引

倒排索引
根据属性值来查看记录;