定义
查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。
那么查找具体是干什么的?有什么用?
其实像百度,谷歌等搜索引擎都用到了查找。它们接收到用户的信息,之后便开始在互联网上查找。并把相关性最大的结果输出。
顺序查找
顺序查找非常简单,就从头到尾遍历数据,然后输出:
for(i=0;i<n;i++){
if(a[i]==num)
printf("%d",a[i]);
}
就像这样。
当然如果害怕数组越界等麻烦,也可以设置一个flag再判断来避免这种麻烦。
折半查找/二分查找
想用二分查找需要一个前提,就是数组必须是有序排列的。比如a[100]={1,2,3,4,5…};。之后吧要查找的数字跟数组的中间值判断,每次折中,一般都要比顺序查找快。
int low=0,high=n,mid;
while(low<=high){
mid=(low+high)/2;
if(key<a[mid])
high=mid-1;
else if(key>a[mid])
low=mid+1;
else
return mid;
}
就像这样。
插值查找
插值查找和二分查找原理相同,只不过插值查找可以是三分四分百分,而怎么算出是几分呢?
插值计算公式:( key-a[low] )/( a[high]-a[low] )
线性索引查找
以上查找都比较基础,但在日常生活中。面对海量无规律的数据,这样查找无疑是大海捞针。计算机虽然不会累,但我们等不起啊。所以我们就要用到索引
稠密索引
稠密索引的原理大概就是,指针数组与其对应的数组间的关系
比方说我们先定义一个指针数组。
int *a[1000];
之后把指针数组中的元素指向其他有具体内容的数组
#include <stdio.h>
int main()
{
int *f[1000];
char a[10]={"apple"},b[10]={"blue"},c[10]={"cat"};
f[1]=a;f[2]=b;f[3]=c;
printf("%s %s %s",f[1],f[2],f[3]);
}
简单说就是这样,我们把一个个单词放到指针数组中。再用上面几种方法查找,就把单词之间的查找变成了数之间的查找。
分块索引
分块索引就是要像图书馆一样,把书籍种类分开,再分开。一层一层查找总比无头苍蝇乱撞要快。
而要把数据分成若干块,还需要满足两个条件。
-
块内无序
-
块间有序
我们定义的分块索引的索引项结构也分为三个数据项: -
最大关键码
-
存储块中的记录个数
-
用于指向块首数据元素的指针
比如我们把上面稠密索引的代码修改一下:
#include <stdio.h>
int main()
{
int *f[1000];
char *a[10],*b[10],*c[10];
char a1='a',a2='b',b1='c',b2='d',c1='e',c2='f';
}
就像这样,一层一层分开。