<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    新的起點 新的開始

    快樂生活 !

    java.util.Arrays的BUG - 二分搜索算法

               Joshua Bloch, 獲得過Jolt最暢銷獎的《Effective Java》的作者, 是Sun Microsystems的杰出工程師和Transarc的資深系統設計師, J2SE 5.0 Tiger的代言人和領路人, 也是還是JSR166的發起人之一..

    后來, Joshua Bloch去了Google, 成為了Google的首席工程師

    Joshua Bloch擁有卡耐基.梅隆大學(CMU)計算機科學的博士學位。

    在 最近Joshua Bloch的一篇文章里, Joshua Bloch回憶了當年在CMU上課的時候, vividly Jon Bentley 第一節算法課, 就要求所有剛進來的PHD學生, 每人都寫一個二分查找算法. 然后發現, 多數人的算法都存在BUG, 這在當時給了Joshua Bloch 一個很深的印象..

    在之后, Joshua Bloch 負責java.util.Arrays 代碼編寫的時候, 采用了Bentley 在<<Programming Pearls >>一書中的二分查找算法, 結果在8年后的今天, Joshua Bloch 發現, 這里面原來還是有一個BUG.

    問題到底是出在哪里? 竟然逃過了Bentley 和Joshua Bloch 的雙重檢測?

    一起來看看java.util.Arrays的代碼:

    1:     public static int binarySearch(int[] a, int key) {
    2:         int low = 0;
    3:         int high = a.length - 1;
    4:
    5:         while (low <= high) {
    6:             int mid = (low + high) / 2;
    7:             int midVal = a[mid];
    8:
    9:             if (midVal < key)
    10:                 low = mid + 1;
    11:             else if (midVal > key)
    12:                 high = mid - 1;
    13:             else
    14:                 return mid; // key found
    15:         }
    16:         return -(low + 1);  // key not found.
    17:     }


    這是很經典的一個二分查找算法.

    bug出現在第6行:

    6:             int mid =(low + high) / 2;

    在一般情況下, 這個語句是不會出錯的, 但是, 當low+high的值超過了最大的正int值 (231 - 1) 的時候, mid會變成負值,  這個時候, 會拋出ArrayIndexOutOfBoundsException 異常..


    所以當一個數組包含超過2的30次方 個元素的時候, 就很可能會帶來問題... 當然, 在一般的應用里面, 很少數組會包含那么多元素, 但是現在這樣的情況已經越來越多了, 比如Google的海量運算..

    那如何解決這個問題?

    很簡單, 修改這行語句為:

    6:             int mid = low + ((high - low) / 2);
    或者
    6:             int mid = (low + high) >>> 1;


    在c或者c++中, 則可以如下實現:
    6:             mid = ((unsigned) (low + high)) >> 1;


    這個問題告訴我們, 無論什么時候, 我們都不要想當然我們的程序是完美的. 我們需要細心的設計,測試再測試,符合規范的方法等等...對此, 你有什么經驗和大家分享嗎?

    同樣給我們帶來的思考是: 8年了, java.util.Arrays 竟然存在這樣一個bug, 這不得不讓我們對JDK本身的測試性, 穩定性 懷有疑問.. 將來又會有多少個類似的bug出現呢?

    posted on 2007-04-05 16:17 advincenting 閱讀(503) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    公告

    Locations of visitors to this pageBlogJava
  • 首頁
  • 新隨筆
  • 聯系
  • 聚合
  • 管理
  • <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    常用鏈接

    留言簿(13)

    隨筆分類(71)

    隨筆檔案(179)

    文章檔案(13)

    新聞分類

    IT人的英語學習網站

    JAVA站點

    優秀個人博客鏈接

    官網學習站點

    生活工作站點

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 四虎成人精品永久免费AV| 猫咪免费人成在线网站| 国产va在线观看免费| 亚洲伊人久久大香线蕉综合图片| 美女视频黄a视频全免费网站色| 国产无遮挡又黄又爽免费视频 | 成人免费无毒在线观看网站| 亚洲一区二区三区不卡在线播放| 久久中文字幕免费视频| 婷婷精品国产亚洲AV麻豆不片 | 亚洲欧美成人av在线观看| 在线成人a毛片免费播放| 亚洲国产一区二区三区在线观看| 日韩免费视频播放| 羞羞的视频在线免费观看| 亚洲国产精品无码久久久久久曰| 人妻免费久久久久久久了| 亚洲国产精品网站在线播放 | 97免费人妻无码视频| 亚洲人成图片网站| 国产又粗又长又硬免费视频| 日本一区二区三区免费高清在线| 狠狠色婷婷狠狠狠亚洲综合 | 亚洲午夜未满十八勿入| 18禁美女裸体免费网站 | 亚洲一区二区三区影院 | 免费看美女午夜大片| 国产亚洲色婷婷久久99精品91| 99精品免费视频| 亚洲乱码一区av春药高潮| 免费激情视频网站| 久久99精品免费一区二区| 亚洲美女视频网址| 在线免费观看视频你懂的| 在线免费视频你懂的| 亚洲一区二区三区夜色| 免费看美女被靠到爽| 中文字幕乱码免费看电影| 2020亚洲男人天堂精品| 亚洲国产成人精品女人久久久 | 狼友av永久网站免费观看|