青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-19  評論-21  文章-0  trackbacks-0
     二分查找法(Binary search algorithm)是一個很常見的算法,從<編程珠璣>里再次看到時又有新的收獲。
     直接看代碼吧,下面是常見的實現代碼:
    
int binary_search(int *a, int num, int t)
{
    
int start = 0, end = num - 1;
    
    
while(end >= start){
        
int middle = (start + end) / 2;
        
int tmp = a[middle];
        
if(tmp < t){
            start 
= middle + 1;
        }
else if(tmp > t){
            end 
= middle - 1;
        }
else{
            
return middle;
        }
    }

    
return -1;
}   

      優化后的代碼為(這個優化的思想也挺好的,不知道有沒有一套系統的方法來思考出這個優化思路):
     
int binary_search(int *a, int num, int t)
{
    
int low = -1, high = num - 1;
    
    
while(low + 1 != high){
        
int middle = (low + high) / 2;
        
if(a[middle] < t){
            low 
= middle;
        }
else{
            high 
= middle;
        }
    }
    
    
if(a[high] != t)
        
return -1;
    
else
        
return high;
}
 
     如果直接看這段代碼,有可能不知道是怎么回事。但是運用書中提到的“程序驗證”的方法后,原理就顯而易見了,修改后的代碼為:

 1 int binary_search(int *a, int num, int t)
 2 {
 3     int low = -1, high = num - 1;
 4     
 5     //invariant: low < high && a[low] < t && a[high] >= t
 6     while(low + 1 != high){
 7         int middle = (low + high) / 2==>  int middle = low + (high - low) / 2;   //防止溢出
 8         if(a[middle] < t){
 9             low = middle;
10         }else{
11             high = middle;
12         }
13     }   
14    //assert: low +1 = high && a[low] < t && a[high] >= t
15   
16     if(a[high] != t)
17         return -1;
18     else
19         return high;
20 }
21 

      “程序驗證” 的思想可以簡述為:不管是驗證一個函數,還是一條語句,一個控制結構(循環,if分支等),都可以采用兩個斷言(前置條件和后置條件)來達到這個目的。前置條件是在執行該處代碼之前就應該成立的條件,后置條件的正確性在執行完該處代碼后必須得到保證。(ps: 斷言也算是一種驗證的手段)

  上面這段代碼的原理是給定一段區間 (low, high] ,如果満足 a[low] < t  && a[high] >=t && high = low + 1,那么有兩種情況存在:1. a[high] = t ; 2.與t相等的元素不存在。由于數組a 肯定滿足條件a[low] < t  && a[high] >=t,所以該算法要做的就是把區間 (-1, num -1] 縮小到(low, low+1]。  
      1. 在執行代碼6~17行時,始終保證low < high && a[low] < t && a[high] >= t 成立。
  
2. 在執行完6~17行后,肯定滿足條件a[low] < t  && a[high] >=t && high = low + 1,因為循環退出的條件是 high = low + 1,而該循環始終保證上面第1條。
  經過這樣的分析后,我們能對程序的正確性有更好的掌握,同時程序也更易理解。

參考:
  1. 基本上摘自<編程珠璣>,很不錯的一本書,讓我對算法有了新的思考,以前只是看看算法導論如何實現的,沒有思考該算法是如何想出來的,有沒有更簡單的算法(思考的過程類似劉未鵬的<知其所以然(續)>),要堅持這個思考過程需要很多功夫與時間,但效果也很明顯,能對算法有更好的掌握。
posted on 2011-06-18 15:02 hex108 閱讀(2882) 評論(3)  編輯 收藏 引用 所屬分類: Algorithm

評論:
# re: 二分查找 -- 來自編程珠璣 2011-06-24 10:11 | tank
你的程序有錯,你知道不??  回復  更多評論
  
# re: 二分查找 -- 來自編程珠璣 2011-06-24 15:53 | hex108
@tank
請指教,謝謝~  回復  更多評論
  
# re: 二分查找 -- 來自編程珠璣[未登錄] 2012-01-18 04:02 | terry
1 2 2 3 查找2,是不是不對?  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲成人资源网| 亚洲一区在线看| 亚洲影视中文字幕| 欧美啪啪一区| 国产资源精品在线观看| 亚洲免费成人av电影| 欧美伊人久久久久久午夜久久久久| 欧美一区二区三区男人的天堂| 亚洲一区www| 亚洲激情精品| 国产精品99一区| 亚洲欧美日韩国产综合精品二区| 亚洲国产小视频在线观看| 国产日韩精品视频一区二区三区| 久久亚洲风情| 国产精品视频| av不卡免费看| 亚洲精品国产欧美| 久久狠狠一本精品综合网| 一区二区欧美视频| 午夜精品视频在线| 国产一区二区三区日韩| 亚洲人成在线播放| 国产日韩一区欧美| 欧美大秀在线观看| 国产精品国内视频| 久久亚洲精选| 国产精品―色哟哟| 亚洲国产高清一区二区三区| 欧美激情91| 午夜精品久久久久久久99热浪潮| 亚洲第一区在线| 亚洲国产精品尤物yw在线观看| 午夜一区二区三区在线观看| 欧美国产乱视频| 亚洲国产另类精品专区| 国产精品入口| 亚洲高清视频中文字幕| 亚洲精品欧美精品| 国产亚洲aⅴaaaaaa毛片| 久久国产精品久久久久久电车 | 久久夜色精品国产欧美乱极品| 午夜精品久久久久久久99水蜜桃| 国产欧美日韩中文字幕在线| 亚洲欧洲精品一区| 亚洲午夜91| 欧美性片在线观看| 亚洲欧美日韩国产综合| 欧美午夜免费影院| 亚洲精品一区二区在线| 亚洲一区亚洲| 亚洲成在人线av| 国产精品视频免费一区| 久久精品视频在线免费观看| 亚洲人成网站在线播| 亚洲专区免费| 激情久久五月| 欧美成人一区二区在线 | 久久福利一区| 国产伦精品一区二区三区免费 | 国产精品人成在线观看免费 | 日韩亚洲视频| 亚洲一区欧美| 欧美三级中文字幕在线观看| 亚洲视频一区二区在线观看 | 欧美一区日本一区韩国一区| 中文欧美字幕免费| 久久久久九九九| 99re热这里只有精品视频| 欧美人与性动交a欧美精品| 亚洲尤物在线| 亚洲第一页在线| 另类天堂av| 久久亚洲精品视频| 一区二区三区视频免费在线观看| 国产精品免费观看在线| 久热精品在线视频| 亚洲国产一区二区精品专区| 黄色精品在线看| 国产一区清纯| 国产精品一区二区三区四区五区| 亚洲国产精品综合| 国产精品美女一区二区在线观看| 久久一区二区三区四区| 久久精品女人的天堂av| 夜夜狂射影院欧美极品| 国产精品二区在线| 午夜精品久久久久久久99热浪潮 | 国产精品亚洲а∨天堂免在线| 亚洲女女女同性video| 99精品国产在热久久| 国产欧美日韩精品丝袜高跟鞋| 久久久噜噜噜久久| 另类春色校园亚洲| 亚洲美女福利视频网站| 亚洲国产精品va在线看黑人| 国产欧美日韩中文字幕在线| 亚洲欧洲在线免费| 亚洲最新视频在线播放| 亚洲国产天堂久久综合网| 99精品国产在热久久| 最新69国产成人精品视频免费| 亚洲欧美日韩精品久久亚洲区| 午夜在线视频观看日韩17c| 欧美视频精品一区| 99在线精品观看| 亚洲小说欧美另类社区| 欧美电影在线免费观看网站| 亚洲精品少妇30p| 亚洲黄色免费网站| 老司机精品导航| 一区二区三区 在线观看视频 | 久久久久久一区二区三区| 亚洲另类黄色| 亚洲国产精品成人综合| 亚洲女同精品视频| 老司机亚洲精品| 国产伦精品一区二区三区免费迷 | 亚洲校园激情| 最新中文字幕一区二区三区| 亚洲视频电影在线| 亚洲欧美日韩成人| 国产精品色婷婷| 久久久久国产精品厨房| 欧美一级免费视频| 久久久久久久久久久久久女国产乱| 久久躁日日躁aaaaxxxx| 亚洲国产一区视频| 亚洲永久精品大片| 欧美激情亚洲另类| 狠狠爱www人成狠狠爱综合网| 久久久青草婷婷精品综合日韩| 亚洲特黄一级片| 久久精品综合一区| a4yy欧美一区二区三区| 欧美久久久久中文字幕| 亚洲七七久久综合桃花剧情介绍| 亚洲电影毛片| 久久免费精品日本久久中文字幕| 亚洲香蕉伊综合在人在线视看| 在线视频精品一区| 亚洲大片av| 亚洲欧美清纯在线制服| 亚洲色图自拍| 亚洲日韩欧美视频一区| 你懂的视频欧美| 亚洲精品网站在线播放gif| 国产日韩一区二区三区在线播放 | 99精品视频免费| 欧美交受高潮1| 国产午夜精品久久| 久久久免费精品视频| 欧美日韩亚洲国产精品| 久久久久久久性| 欧美一区二区三区免费视频| 一区二区在线观看视频在线观看| 亚洲国产一区二区精品专区| 免费视频一区二区三区在线观看| 亚洲国产小视频在线观看| 国产精品久久久久毛片大屁完整版| 亚洲精品护士| 久久免费黄色| 久久精品国产v日韩v亚洲 | 一区二区三区在线不卡| 欧美国产精品日韩| 午夜精品三级视频福利| 国产精品一卡| 欧美激情一区三区| 国产一级精品aaaaa看| 亚洲国产精品成人综合| 91久久精品国产91性色tv| 国产欧美日韩视频一区二区三区| 亚洲激情亚洲| 久久久综合免费视频| 欧美日韩中文字幕| 亚洲韩国日本中文字幕| 国产女人精品视频| 亚洲欧美日韩视频二区| 午夜久久久久久| 亚洲性感激情| 一区二区三欧美| 午夜激情综合网| 亚洲一区二区三区色| 亚洲网站在线播放| 亚洲无亚洲人成网站77777| 亚洲国产经典视频| 久久亚洲不卡| 欧美一区二区三区免费看 | 久久久久看片| 亚洲黄一区二区| 欧美日韩视频免费播放| 国产精品都在这里| 蜜臀a∨国产成人精品| 91久久精品一区| 亚洲欧美精品在线| 亚洲福利视频在线| 欧美电影免费观看大全| 久久亚洲一区二区三区四区| 欧美极品在线播放| 欧美伊人影院|