zoukankan      html  css  js  c++  java
  • 从二分看算法严谨性

    考虑以下二分查找的代码:
    #include <stdio.h>
    intbsearch(intarray[], intn, intv)
    {
        intleft, right, middle;
        left = 0, right = n - 1;
        while(left <= right) {
            middle = left + (right - left) / 2;
            if(array[middle] > v ) {
                right = middle;
            } elseif (array[middle] < v) {
                left = middle;
            } else{
                returnmiddle;
            }
      } 
        return-1;
    }
    对于输入array为:{2, 6, 8, 10, 13, 25, 36, 45, 53, 76, 88, 100, 127}, n = 13, v = 127时,
    运行bsearch函数,while循环调用的次数为____。
    1.middle = (0+12)/2=6
    2.middle = (6+12)/2=9
    3.middle = (9+12)/2=10
    4.middle =(10+12)/2=11
    5.middle = (11+12)/11....循环无数次!!!
    
    #include <stdio.h>
    intbsearch(intarray[], intn, intv)
    {
        intleft, right, middle;
        left = 0, right = n - 1;
        while(left <= right) {
            middle = left + (right - left) / 2;
            if(array[middle] > v ) {
                right = middle-1;
            } elseif (array[middle] < v) {
                left = middle+1;
            } else{
                returnmiddle;
            }
      } 
        return-1;
    }
    1. middle = 6;
    2.middle=(7+12)/2=9;
    3.middle=(10+12)/2=11
    4.middle=(12+12)/2=12....bingo
    原因:第一个代码在最后两个数的时候收敛了到了前一个数,不能向前推进使得
    达到循环结束条件,如果保证leftright以最小区间去逼近,才能够绝对收敛或
    使得循环条件终止
  • 相关阅读:
    RFC7296--Internet密钥交换协议版本2(IKEv2)
    IPSec 100问
    strongswan--函数定义宏
    RFC6311--协议支持IKEv2 / IPsec的高可用性
    IPSec之security acl
    华罗庚
    韩罗塔核心算法
    javaBean
    Servlet
    javaee Api
  • 原文地址:https://www.cnblogs.com/freeopen/p/5482990.html
Copyright © 2011-2022 走看看