一個經典的二分查找算法

一個經典的二分查找算法
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:     }



很有意思,java.util.Arrays的BUG 。

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章