查找算法:
静态查找:数据集合稳定,不需要添加、删除元素的查找操作
动态查找:数据集合在查找的过程中需要同时添加或删除元素的查找操作
查找结构:对于静态查找,用线性表来组织结构--使用顺序查找算法;对于动态查找,运用二叉排序树的查找技术...
顺序查找:线性查找
从第一个或最后一个记录开始,逐个进行记录的关键字和给定值比较
//顺序查找
int sq_search(int *a,int n,int key)
{
int i;
for(i=1;i<=n;i++)
{
if(a[i]==key)
{
return i;
}
}
return 0;
}
#还可以进行优化--
插值查找:按比例查找
其实类似于半值查找
//插值查找
#include<stdio.h>
int bin_search(int str[],int n,int key)
{
int low,high,mid;
low=0;
high=n-1;
while(low<=high)
{
//插值唯一不同处
mid=low+(key-a[low])/(a[high]-a[low])*(high-low);
if(str[mid]==key)
{
return mid;
}
if(str[mid]<key)
{
low=mid+1;
}
if(str[mid]>key)
{
high=mid-1;
}
}
return -1;
}
#a是下标值的数组
斐波那契查找:
黄金比例、黄金分割:大:小=全部:大=1:0.618
斐波那契额数列:1,1,2,3,5,8,13,21...
A(n-1)/A(n)=0.618
mid=0.618--的插值查找
#如果待查找数据不够,就补充一部分
线性索引查找:
之前的待查找顺序是有序的...
1.稠密索引:建立一个索引表:(下标、关键码、指针),关键码是指关键信息的提炼;指针指向记录,一对一
#应用于数据量不是特别大的
2.分块索引:索引表各块之间存放最大关键字,地址是各块内的起始地址字(按一定比例分块)
#块内无序
3.倒排索引:关键字有一个记录号表
#维护方面比较复杂