查找

定义

查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。

那么查找具体是干什么的?有什么用?

其实像百度,谷歌等搜索引擎都用到了查找。它们接收到用户的信息,之后便开始在互联网上查找。并把相关性最大的结果输出。

顺序查找

顺序查找非常简单,就从头到尾遍历数据,然后输出:

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';
}

就像这样,一层一层分开。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值