二分检索

简介:   现在理论的还是少说些,例子更能理解吧,来个例子用二分检索算法设计与分析,下面算法函数过程bin_search有n+2个输入:a,n 和 x,一个输出j。只要待检索的元素存在,while循环就继续下去。

  现在理论的还是少说些,例子更能理解吧,来个例子用二分检索算法设计与分析,下面算法函数过程bin_search有n+2个输入:a,n 和 x,一个输出j。只要待检索的元素存在,while循环就继续下去。case语句根据compare(x,a[mid])的结果的三种情况进行选择运行。函数过程结束时,如果x不在表a中,则j=0,否则 a(j)=x。

void bin_search(elemType a[],int n,elemType x,int &j) {
//给定一个按非递减排列的元素数组a(1:n),n>1,判断x是否出现。
//若是,则置j,使得x=a(j),若非,则j=0。函数返回j。
int low,high,mid;
low=1;high=n;j = 0while(low<=high) {
mid = (low + high) / 2//mid取不大于(low + high)÷2的整数。
switch(compare(x,a[mid])) {
case ‘<’ : high = mid -1break//x小于a[mid]
case ‘>’ : low = mid +1break//x大于a[mid]
case ‘=’ : j = mid;return j;break//x等于a[mid]
}//switch
}//while
return j;
}//bin_search


判断bin_search是否为一个算法,除了上面的描述外,还必须使函数compare(x,a[mid])具有恰当的定义。如果a的元素是整数,实数或字符串,则这些比较运算都可用适当的指令正确完成的。另外,还需判断bin_search是否能终止。关于这一点留待证明算法正确性时回答,但是关于程序正确性的证明,至今为止还是一个尚未解决的课题。

  bin_search需要的空间很容易确定,它要用n个单元存放数组a[],还要有存放变量low、high、mid、x和j的5个空间单元。因此所需的空间单元是n+5。至于它的计算时间,则要分别考虑最好、平均和最坏三种情况。

  下面述说那几个定理吧。

(1)函数过程bin_search(a[],n,x,j)能正确地运行。

(2)若n在区域[2k-1,2k]中,则对于一次成功的检索,bin_search至多作k次比较;而对于一次不成功的检索,或者作k-1次比较或者作k次比较。这个说明:

最坏情况下的成功或不成功检索的计算时间都是О(log2n);
最好情况下的成功检索在1级结点处达到,计算时间为Θ(1);
最好情况下的不成功检索要作log2n次元素比较,所以计算时间是Θ(log2n)。
由于外部结点都在k和k+1级,因此每种不成功检索的时间都为Θ(log2n),故
平均情况下不成功检索的计算时间为Θ(log2n),记为U(n)。

(3) 设A(l:n)含有n(≥1)个不同的元素,且A(1)<A(2)<…<A(n)。又设用以比较为基础的判断x是否在A(l:n)出现的任何算法在最坏情况下所需的最小比较次数是FIND(n),那么, FIND(n)≥「log2(n+1)」。

关于这个真的是好难呀,笔者觉得要在实践的基础上,练习,加上理论才能深刻了解,在此只是简约的总结一下二分检索的相关知识。

 

 

相关文章
|
7月前
|
人工智能 算法 测试技术
【动态规划】【二分查找】C++算法 466 统计重复个数
【动态规划】【二分查找】C++算法 466 统计重复个数
|
7月前
|
算法 测试技术 C++
【动态规划】【离线查询】【前缀和】689. 三个无重叠子数组的最大和
【动态规划】【离线查询】【前缀和】689. 三个无重叠子数组的最大和
|
4月前
|
算法
【算法】二分算法——搜索插入位置
【算法】二分算法——搜索插入位置
|
7月前
|
算法
【算法系列篇】递归、搜索和回溯(四)
【算法系列篇】递归、搜索和回溯(四)
|
7月前
|
机器学习/深度学习 移动开发
【归并排序】【图论】【动态规划】【 深度游戏搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数
【归并排序】【图论】【动态规划】【 深度游戏搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数
|
7月前
|
算法
【算法系列篇】递归、搜索和回溯(二)
【算法系列篇】递归、搜索和回溯(二)
|
7月前
|
算法
【算法系列篇】递归、搜索与回溯(一)
【算法系列篇】递归、搜索与回溯(一)
|
7月前
|
算法
【算法系列篇】递归、搜索和回溯(三)
【算法系列篇】递归、搜索和回溯(三)
|
算法 索引
算法:二分查找算法/朴素二分/查找区间左右端点二分
算法:二分查找算法/朴素二分/查找区间左右端点二分
|
存储 索引
二分查找问题(关键:确定搜索区间)
二分查找问题(关键:确定搜索区间)