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

隨筆-19  評論-21  文章-0  trackbacks-0
     二分查找法(Binary search algorithm)是一個很常見的算法,從<編程珠璣>里再次看到時又有新的收獲。
     直接看代碼吧,下面是常見的實現(xiàn)代碼:
    
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;
}   

      優(yōu)化后的代碼為(這個優(yōu)化的思想也挺好的,不知道有沒有一套系統(tǒng)的方法來思考出這個優(yōu)化思路):
     
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 

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

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

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

評論:
# re: 二分查找 -- 來自編程珠璣 2011-06-24 10:11 | tank
你的程序有錯,你知道不??  回復(fù)  更多評論
  
# re: 二分查找 -- 來自編程珠璣 2011-06-24 15:53 | hex108
@tank
請指教,謝謝~  回復(fù)  更多評論
  
# re: 二分查找 -- 來自編程珠璣[未登錄] 2012-01-18 04:02 | terry
1 2 2 3 查找2,是不是不對?  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 久久精品一二三| 欧美www在线| 国产精品啊啊啊| 国产一区二区三区在线观看网站 | 国产精品视频免费| 亚洲视频高清| 亚洲欧美在线另类| 榴莲视频成人在线观看| 欧美日韩精品一区二区| 国产精品日韩一区二区三区| 在线看无码的免费网站| 一区电影在线观看| 久久精品99| 欧美国产三区| 亚洲欧美一级二级三级| 欧美岛国在线观看| 国产日韩精品电影| 99精品福利视频| 久久精视频免费在线久久完整在线看| 老司机精品视频一区二区三区| 亚洲黑丝在线| 亚洲欧美日韩综合| 蜜月aⅴ免费一区二区三区 | 91久久精品一区| 午夜精品久久久| 欧美喷水视频| 亚洲二区免费| 欧美在线资源| 亚洲毛片播放| 久久久久久一区二区三区| 欧美日韩亚洲一区在线观看| 黄色一区二区在线| 欧美一区二区三区的| 日韩视频一区二区在线观看| 久久综合色婷婷| 国产欧美亚洲一区| 午夜久久美女| 亚洲最新中文字幕| 美女诱惑一区| 亚洲国产清纯| 欧美 日韩 国产 一区| 欧美一区二区精品在线| 国产精品护士白丝一区av| 日韩一区二区电影网| 亚洲国产欧美久久| 欧美freesex8一10精品| 精品福利免费观看| 久久久91精品国产一区二区精品| 一区二区三区视频免费在线观看| 欧美日韩伦理在线免费| 亚洲日本国产| 亚洲黄色高清| 欧美日韩国产精品| 亚洲午夜精品一区二区| 一区二区三区四区五区视频| 欧美日韩亚洲一区二区三区四区| 亚洲深夜福利| 亚洲天天影视| 国产一区二区欧美| 男男成人高潮片免费网站| 久久久久国产精品一区| 亚洲缚视频在线观看| 亚洲日产国产精品| 亚洲国产精彩中文乱码av在线播放| 久久久久久久97| 伊人久久综合97精品| 欧美freesex8一10精品| 免费成人av在线看| 亚洲天堂av高清| 亚洲欧美视频| 亚洲高清影视| 最新国产成人在线观看| 欧美日韩国产专区| 欧美一级电影久久| 欧美在线关看| 亚洲精品一区中文| 一区二区三区精品在线 | 国产精品videosex极品| 欧美在线亚洲综合一区| 老牛嫩草一区二区三区日本 | 亚洲一区二区高清视频| 亚洲欧美精品suv| 亚洲国产成人精品视频| aa亚洲婷婷| 精品动漫3d一区二区三区免费| 亚洲高清视频的网址| 国产精品免费区二区三区观看| 久久久久国产精品一区二区| 欧美**字幕| 久久精品91久久香蕉加勒比| 欧美成人精品在线观看| 欧美一区二区三区在线看| 免费观看一级特黄欧美大片| 亚洲免费在线观看| 玖玖玖国产精品| 香蕉av777xxx色综合一区| 免费成人小视频| 欧美一区二区成人| 欧美精品日日鲁夜夜添| 久久综合久久久| 国产精品九九| 亚洲人成人一区二区在线观看| 国产欧美日韩一区| 日韩特黄影片| 亚洲欧洲日夜超级视频| 欧美在线高清| 久久精品99国产精品| 国产精品久久国产精品99gif| 亚洲福利视频一区| 极品少妇一区二区三区精品视频| 亚洲视频免费在线| 一区二区三区日韩精品| 久久伊人一区二区| 久久―日本道色综合久久| 国产农村妇女精品| 中国日韩欧美久久久久久久久| 亚洲狼人综合| 久久综合中文字幕| 老**午夜毛片一区二区三区| 国产日本欧美视频| 亚洲欧美一级二级三级| 欧美一区二区播放| 国产欧美亚洲一区| 亚洲综合电影| 欧美亚洲一区二区在线观看| 亚洲一级黄色片| 亚洲视频一区在线| 欧美精品性视频| 亚洲精品国产精品久久清纯直播| 亚洲欧洲另类国产综合| 嫩草影视亚洲| 亚洲高清二区| 亚洲视频在线看| 欧美性生交xxxxx久久久| 99视频在线精品国自产拍免费观看| 99精品国产高清一区二区 | 欧美亚洲免费在线| 久久精品视频免费播放| 黄色亚洲大片免费在线观看| 久久久久久久久久久成人| 嫩模写真一区二区三区三州| 亚洲激精日韩激精欧美精品| 欧美国产1区2区| 一本久久精品一区二区| 欧美一级视频一区二区| 激情综合五月天| 欧美福利电影在线观看| 99热免费精品在线观看| 午夜日韩在线观看| 伊甸园精品99久久久久久| 欧美91视频| 亚洲亚洲精品在线观看 | 一本久久知道综合久久| 欧美一区在线直播| 影音先锋日韩资源| 欧美日韩1区2区| 午夜亚洲视频| 亚洲成色777777在线观看影院| 99在线热播精品免费| 国产乱码精品| 美国十次了思思久久精品导航| 亚洲精品在线视频| 久久久久9999亚洲精品| 亚洲国产精品久久久久婷婷884| 欧美激情综合色| 午夜久久99| 日韩小视频在线观看专区| 久久精品一区| 在线视频亚洲| 欲色影视综合吧| 国产精品v欧美精品∨日韩| 久久久美女艺术照精彩视频福利播放 | 国产精品揄拍一区二区| 六月婷婷久久| 99在线精品观看| 模特精品在线| 欧美在线高清| 亚洲伦伦在线| 精品电影一区| 国产日韩欧美一区| 欧美体内谢she精2性欧美| 狼狼综合久久久久综合网| 亚洲男人av电影| 99伊人成综合| 亚洲精品一区二区三区婷婷月| 久久综合中文字幕| 久久成人av少妇免费| 亚洲图片欧美午夜| 日韩一级免费观看| 亚洲精品久久久久久久久久久久久| 国产亚洲欧美一区| 欧美一区永久视频免费观看| 一区二区三区四区五区在线|