• 二分检索


      现在理论的还是少说些,例子更能理解吧,来个例子用二分检索算法设计与分析,下面算法函数过程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)」。

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

  • 相关阅读:
    Java实现 LeetCode 343 整数拆分(动态规划入门经典)
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 338 比特位计数
    H264(NAL简介与I帧判断)
    分享一段H264视频和AAC音频的RTP封包代码
  • 原文地址:https://www.cnblogs.com/lihuidashen/p/3414970.html
Copyright © 2020-2023  润新知