<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站點

    優秀個人博客鏈接

    官網學習站點

    生活工作站點

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲视频在线视频| 亚洲区小说区图片区| 亚洲精品自拍视频| 2020因为爱你带字幕免费观看全集| 久久精品夜色国产亚洲av| 野花香高清视频在线观看免费| 亚洲国产日韩在线视频| 国产高清不卡免费视频| 亚洲第一成年人网站| 美女被免费喷白浆视频| 亚洲乱码无人区卡1卡2卡3| 国产美女精品久久久久久久免费| 免费人妻精品一区二区三区| 久久精品夜色噜噜亚洲A∨| 国产午夜无码精品免费看 | 成年人免费网站在线观看| 亚洲乱理伦片在线观看中字| 亚洲第一永久AV网站久久精品男人的天堂AV | 国产精品免费观看调教网| 久久久久亚洲AV片无码下载蜜桃| 1000部免费啪啪十八未年禁止观看| 亚洲国产精品张柏芝在线观看| 久久国内免费视频| 国产精品手机在线亚洲| 亚洲色成人网站WWW永久| 最近免费中文字幕mv电影| 亚洲熟妇无码AV不卡在线播放| 亚洲国产成人爱av在线播放| 免费无码又爽又刺激网站| 激情综合亚洲色婷婷五月| 亚洲AV无码专区日韩| 亚洲精品免费观看| 亚洲狠狠婷婷综合久久蜜芽| 国产亚洲一区二区三区在线不卡| 91av免费观看| 黄色a级片免费看| 久久久婷婷五月亚洲97号色 | 国产精品亚洲精品观看不卡| 伊在人亚洲香蕉精品区麻豆| 一级毛片全部免费播放| 亚洲第一se情网站|