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 = 0; while(low<=high) { mid = (low + high) / 2; //mid取不大于(low + high)÷2的整数。 switch(compare(x,a[mid])) { case ‘<’ : high = mid -1;break; //x小于a[mid] case ‘>’ : low = mid +1;break; //x大于a[mid] case ‘=’ : j = mid;return j;break; //x等于a[mid] }//switch }//while return j; }//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)」。
关于这个真的是好难呀,笔者觉得要在实践的基础上,练习,加上理论才能深刻了解,在此只是简约的总结一下二分检索的相关知识。
作者: 李肖遥, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-3912462.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论