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

隨筆-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 閱讀(2881) 評論(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>
            国产精品v一区二区三区| 欧美激情综合在线| 欧美激情成人在线| 加勒比av一区二区| 久久久噜噜噜久久| 一本色道88久久加勒比精品| 性欧美video另类hd性玩具| 欧美四级电影网站| 亚洲一区二区免费在线| 亚洲国产成人在线播放| 亚洲激情婷婷| 久久综合九色欧美综合狠狠| 免费在线国产精品| 亚洲午夜日本在线观看| 午夜在线不卡| 夜夜嗨av一区二区三区网站四季av | 在线看欧美日韩| 亚洲私人影院在线观看| 1000部国产精品成人观看| 亚洲精品午夜精品| 国产精品国产自产拍高清av王其| 久久国产精品一区二区三区四区| 亚洲一区三区电影在线观看| 很黄很黄激情成人| 亚洲免费在线视频一区 二区| 亚洲毛片网站| 久久精品国产精品| 欧美在线观看www| 国产精品国产馆在线真实露脸| 亚洲高清毛片| 亚洲人成毛片在线播放| 久久婷婷国产麻豆91天堂| 欧美伊人精品成人久久综合97| 欧美经典一区二区三区| 亚洲国产视频一区二区| 亚洲娇小video精品| 欧美国产日韩一区| 亚洲激情成人在线| 亚洲一区亚洲二区| 国产欧亚日韩视频| 久久五月天婷婷| 亚洲日本中文| 欧美一级免费视频| 亚洲福利在线看| 欧美片第一页| 亚洲男女毛片无遮挡| 国产欧美91| 欧美xx69| 亚洲午夜在线观看视频在线| 欧美在线观看一区| 亚洲精品日日夜夜| 国产一区三区三区| 欧美日韩影院| 久久久久看片| 亚洲性夜色噜噜噜7777| 欧美成人精品一区二区| 中文网丁香综合网| 伊人色综合久久天天| 国产精品高清在线| 欧美大成色www永久网站婷| 亚洲视频在线观看| 亚洲国产老妈| 欧美99在线视频观看| 亚洲一区二区三区中文字幕| 亚洲成人在线观看视频| 国产精品亚洲人在线观看| 每日更新成人在线视频| 久久久7777| 久久av在线| 午夜一级久久| 午夜精品在线| 亚洲一区二区三区免费在线观看| 亚洲国产精品一区二区第四页av| 久久亚洲一区二区三区四区| 久久精品日韩| 久久夜色精品国产噜噜av| 午夜精品国产更新| 亚洲欧美影院| 久久久噜噜噜久久久| 麻豆av一区二区三区久久| 久久精品免费看| 欧美高清在线一区二区| 亚洲国产另类久久久精品极度| 亚洲成人在线网| 一区二区三区高清| 一区二区三区色| 久久成人这里只有精品| 欧美一区二区成人6969| 久久久久久夜精品精品免费| 麻豆av福利av久久av| 亚洲精品国精品久久99热| 一本色道久久88综合亚洲精品ⅰ | 亚洲综合999| 欧美在线综合视频| 欧美激情视频在线免费观看 欧美视频免费一| 久久亚洲国产成人| 亚洲精品黄色| 老司机午夜精品视频| 国产精品swag| 亚洲免费av电影| 美女视频黄 久久| 午夜欧美大尺度福利影院在线看| 久久五月天婷婷| 韩日欧美一区二区三区| 亚洲一区二区精品视频| 免费在线成人av| 午夜精品久久久| 国产精品99免费看 | 亚洲综合精品一区二区| 嫩草伊人久久精品少妇av杨幂| 一区二区三区精品国产| 久久精品男女| 国产一区欧美日韩| 久久精品二区亚洲w码| 亚洲尤物视频网| 国产精品久久久久久久久动漫| 亚洲精品免费在线播放| 亚洲电影专区| 欧美日本国产| 午夜视黄欧洲亚洲| 亚洲一区二区视频| 一本色道久久综合亚洲精品按摩| 欧美国产一区二区| 一区二区不卡在线视频 午夜欧美不卡'| 麻豆成人91精品二区三区| 久久躁狠狠躁夜夜爽| 亚洲国产一区二区三区青草影视| 欧美激情免费观看| 欧美日韩高清在线一区| 亚洲女人天堂av| 久久精品99久久香蕉国产色戒| 黄网站色欧美视频| 亚洲国产欧美久久| 国产精品日韩专区| 欧美福利在线观看| 欧美视频专区一二在线观看| 欧美在线亚洲在线| 欧美激情第10页| 久久资源av| 国产精品视频精品| 亚洲电影免费观看高清完整版在线观看| 久久永久免费| 性色一区二区三区| 免费成年人欧美视频| 亚洲欧美999| 欧美国产精品日韩| 久久夜色精品国产欧美乱极品| 欧美电影免费观看网站| 久久久欧美一区二区| 国产精品福利片| 亚洲人成毛片在线播放女女| 国产视频一区在线观看| 欧美激情一级片一区二区| 欧美日韩在线一区二区| 欧美激情在线有限公司| 国产一区二区日韩精品| 亚洲影院免费| 久久精品91久久香蕉加勒比| 欧美午夜不卡在线观看免费| 亚洲精品一级| 宅男噜噜噜66一区二区| 欧美日韩视频在线| 一二三区精品| 欧美在线视频日韩| 激情欧美一区| 欧美va天堂在线| 亚洲国产日韩欧美在线动漫| 欧美激情一二三区| 亚洲国产一区在线| 一本色道久久88精品综合| 欧美日韩国产成人在线91| 一个人看的www久久| 久久精品视频免费| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久夜色撩人精品| 欧美二区视频| 一区二区三区.www| 国产精品亚洲欧美| 欧美成年网站| 香蕉乱码成人久久天堂爱免费 | 欧美va天堂| 西瓜成人精品人成网站| 国外成人性视频| 欧美日韩高清在线| 久久久www| 亚洲一区二区免费在线| 麻豆freexxxx性91精品| 亚洲——在线| 99精品国产福利在线观看免费| 国产精品主播| 欧美日韩亚洲一区二区三区在线| 亚洲一区中文| 99视频日韩| 亚洲美女毛片| 欧美成人综合在线| 久久阴道视频| 久久女同互慰一区二区三区| 亚洲欧美成人网| 亚洲欧美卡通另类91av| 亚洲天堂av图片|