1.查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。
查找算法分类:
1)静态查找和动态查找;
注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。
2)无序查找和有序查找。
无序查找:被查找数列有序无序均可;
有序查找:被查找数列必须为有序数列。
2.平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。
对于含有n个数据元素的查找表,查找成功的平均查找长度为:ASL = Pi*Ci的和。
Pi:查找表中第i个数据元素的概率。
Ci:找到第i个数据元素时已经比较过的次数。
二.查找算法:
1.顺序查找:
int SequenceSearch(int a[],int value,int n)
{
int i;
for(i=0;i<n;i++)
if(a[i]=value)
return i;
return -1;
}
//添加哨兵
//避免了每次i与n的比较
int SequenceSearch(int a[],int value,int n)
{
int i;
a[n]=value;//哨兵
i=0;
while(a[i]!=value)
{
i++;
}
return i;//返回n查找失败
}
复杂度:![](https://img-blog.csdn.net/20180816160015277?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTAzMTg5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
2.二分法查找:
int BinarySearch(int a[],int value,int n)
{
int low,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==value)
return mid;
if(a[mid]>value)
high = mid-1;
if(a[mid]<value)
low = mid+1;
}
return -1;
}
递归版本:
int BinarySearch2(int a[], int value, int low, int high)
{
int mid = low+(high-low)/2;
if(a[mid]==value)
return mid;
if(a[mid]>value)
return BinarySearch2(a, value, low, mid-1);
if(a[mid]<value)
return BinarySearch2(a, value, mid+1, high);
}
3.插值查找:
int BinarySearch2(int a[], int value, int low, int high)
{
int mid = low+(high-low)*(value-a[low])/(a[high]-a[low]);
if(a[mid]==value)
return mid;
if(a[mid]>value)
return BinarySearch2(a, value, low, mid-1);
if(a[mid]<value)
return BinarySearch2(a, value, mid+1, high);
}
4.菲波那切查找:
int Fibonacci_Search(int a[],int n,int value)
{
int low,high,mid,i,k;
low=1; //最下标为记录首位
high=n; //最高下标为记录首位
k=0;
while(n>F[k]-1) //计算n位于斐波那契的位置
k++;
for(i=n;i<F[k]-1;i++) //将不满的数值补全
a[i]=a[n];
while(low<high)
{
mid=low+F[k-1]-1;
if(value<a[mid])
{
high=mid-1;
k=k-1;
}
else if(value>a[mid])
{
low=mid+1;
k=k-2;
}
else
{
if(mid<=n)
return mid; //查找到位置
else
return n; //补全数值返回n
}
}
return 0;
}
参考资料:
《大话数据结构》