【数据结构】——折半查找详解

关于查找,在我们日常生活中处处可见。关于顺序表的查找非常简单,就是在数组里面查看有没有关键字,挨个儿对比最后返回数组下标即可,这篇文章主要来讲讲有序表查找中的一种——折半查找~

一、什么是折半查找

我们把每次去中间记录查找的方法叫做折半查找。
折半查找又称为二分查找。他的前提是线性表中的记录必须是关键码有序(通常是从小到大有序)。

二、折半查找的基本思想

在有序表中,取中间记录作为比较对象,如果key和中间记录关键字相等,就查找成功;如果key<mid就在mid的左边继续查找,如果key>mid就在mid的右边继续查找。不断重复上述过程,知道查找成功,或所有查找区域没有记录,查找失败为止

三、代码实现

int Binary_Search(int* a,int n,int key)
{
 int low,high,mid;
 low = 1;
 high = n;
 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;
 }
 return 0;
}

时间复杂度为:O(logn)
注意:因为折半查找要求有序,对于需要频繁执行插入语或删除操作的数据集来说,维护有序的排序会带来不小的工作量,就不建议使用。

四、折半查找的改进

1、插值查找
现在我们遇到的新问题就是为什么一定要折半,而不是折四分之一呢。因此我们把上面求中间值的代码改成mid = low+1/2(high-low)
插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找算法,其核心就是在于插值的计算公式
在这里插入图片描述
所以计算公式为在这里插入图片描述
从时间复杂度来看,它也是O(logn),**但对于表长较大,而关键字分布又比较均匀的查找表来说,**插值查找算法的平均性能比折半查找要好得多

2、斐波那契查找
利用黄金分割原理来实现的查找。从时间复杂度来看,它也是O(logn)。斐波那契查找只是进行最简单的加减法运算mid = low+ f[k-1]-1在海量的数据查找过程中,这种席位的差别可能会影响最终的查找效率。

发布了62 篇原创文章 · 获赞 7 · 访问量 2578

猜你喜欢

转载自blog.csdn.net/qq_43412060/article/details/104382665