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

隨筆-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 閱讀(2884) 評論(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>
            亚洲大片在线| 久久成人综合视频| 欧美一区激情视频在线观看| 亚洲区一区二| 亚洲老板91色精品久久| 亚洲三级免费电影| 一区二区三区高清在线| 亚洲视频一区| 欧美一激情一区二区三区| 香蕉国产精品偷在线观看不卡| 香蕉乱码成人久久天堂爱免费| 久久久国产一区二区三区| 美女诱惑黄网站一区| 欧美国产综合一区二区| 国产日韩欧美二区| 亚洲国产精品久久91精品| 亚洲精品资源| 亚洲男人的天堂在线| 久久久久免费观看| 亚洲国产午夜| 日韩网站在线看片你懂的| 午夜国产精品视频免费体验区| 久久全球大尺度高清视频| 欧美日韩视频在线| 国产主播一区二区| 亚洲视频碰碰| 欧美成人免费在线| 亚洲夜间福利| 欧美激情在线狂野欧美精品| 国产日韩一区欧美| 艳妇臀荡乳欲伦亚洲一区| 久久精品国产99| 一区二区不卡在线视频 午夜欧美不卡'| 午夜欧美大片免费观看| 欧美精品18+| 精品91免费| 欧美永久精品| 曰本成人黄色| 亚洲欧美文学| 亚洲巨乳在线| 你懂的网址国产 欧美| 国产主播在线一区| 亚洲综合色在线| 亚洲人成久久| 免费久久久一本精品久久区| 国产精品一二三四| 亚洲桃花岛网站| 亚洲人成网站在线播| 另类激情亚洲| 在线看欧美日韩| 久久久久久一区| 小辣椒精品导航| 国产欧美日韩综合一区在线观看 | 久久天天躁狠狠躁夜夜爽蜜月| 一本色道久久综合| 欧美精品一区二区三区久久久竹菊| 精品99视频| 久久精品首页| 亚洲一区二区三区中文字幕| 欧美日韩免费观看一区| 日韩一级在线| 亚洲片国产一区一级在线观看| 久久综合九色99| 亚洲电影欧美电影有声小说| 久久久水蜜桃| 久久综合九色99| 亚洲国产婷婷综合在线精品 | 在线一区二区日韩| 亚洲精品一区中文| 欧美日韩蜜桃| 午夜一区二区三区在线观看| 亚洲午夜国产一区99re久久 | 妖精视频成人观看www| 欧美日韩无遮挡| 亚洲综合欧美| 欧美一区影院| 1024日韩| 亚洲欧洲日韩在线| 欧美四级电影网站| 久久国产直播| 免费在线国产精品| 久久久久91| 亚洲第一中文字幕| 亚洲国产日韩欧美在线动漫| 欧美日韩黄色大片| 性娇小13――14欧美| 久久福利视频导航| 99成人在线| 午夜日韩在线观看| 亚洲日本国产| 亚洲欧美国内爽妇网| 亚洲成色www8888| 亚洲精品在线观看免费| 国产精品一二一区| 亚洲第一级黄色片| 国产精品久久久久久妇女6080 | 久久另类ts人妖一区二区| 免费人成精品欧美精品| 亚洲一区三区电影在线观看| 久久大逼视频| 亚洲欧美久久| 免费永久网站黄欧美| 久久成人国产精品| 欧美精品九九| 久久影音先锋| 国产精品久久久久一区二区三区共 | 欧美视频在线播放| 久久久精品日韩| 欧美日韩国产三区| 久久久亚洲国产美女国产盗摄| 欧美激情视频在线播放| 久久久综合网站| 国产精品久久久一本精品| 欧美二区在线观看| 国产亚洲欧美另类一区二区三区| 亚洲精品1区| 激情久久综合| 欧美一区91| 午夜视频精品| 欧美午夜激情在线| 亚洲综合视频网| 欧美激情黄色片| 欧美成人免费在线视频| 国产亚洲成精品久久| 亚洲婷婷在线| 亚洲永久免费精品| 欧美日韩免费观看一区三区 | 国内精品一区二区| 亚洲一二三级电影| 一区二区激情视频| 欧美激情女人20p| 欧美成人首页| 亚洲国产一区二区a毛片| 久久成人免费网| 久久久九九九九| 国产一区二区久久久| 午夜精品免费在线| 欧美中在线观看| 国产午夜亚洲精品羞羞网站| 亚洲免费视频一区二区| 午夜欧美大尺度福利影院在线看| 国产精品国内视频| 这里只有精品视频在线| 亚洲一区高清| 国产乱人伦精品一区二区 | 亚洲精品三级| 欧美巨乳在线观看| 99国内精品| 欧美一级播放| 在线观看欧美| 欧美 日韩 国产 一区| 亚洲大片av| 夜夜嗨av一区二区三区| 欧美成人精品高清在线播放| 久久视频一区二区| 国产免费观看久久| 一本大道av伊人久久综合| 亚洲人成在线影院| 久久久噜久噜久久综合| 午夜精品区一区二区三| 国产精品高潮在线| 夜夜嗨av一区二区三区| 日韩一级裸体免费视频| 欧美/亚洲一区| 日韩一区二区久久| 久久久久国产精品厨房| 性做久久久久久久免费看| 欧美18av| 亚洲欧美一区二区三区在线| 韩国视频理论视频久久| 欧美大片在线观看一区二区| 久久婷婷国产综合尤物精品 | 亚洲国产精品99久久久久久久久| 亚洲欧洲在线播放| 国产精品视频免费| 毛片一区二区三区| 亚洲一区二区三区在线看| 免费亚洲电影在线观看| 亚洲一区在线直播| 在线电影国产精品| 欧美一区二区三区的| 欧美黄色精品| 午夜精品福利视频| 亚洲美女中文字幕| 国产一区白浆| 欧美午夜宅男影院| 麻豆精品精华液| 欧美一级片在线播放| 最新国产成人av网站网址麻豆| 亚洲欧美日韩精品久久亚洲区| 海角社区69精品视频| 欧美婷婷六月丁香综合色| 免费亚洲网站| 久久精品国产欧美亚洲人人爽| 日韩午夜电影av| 亚洲电影免费在线观看| 久久精品盗摄| 欧美一区高清| 亚洲综合三区| 亚洲一区三区电影在线观看|