Java實現二分尋找演算法

來源:互聯網
上載者:User

Java實現二分尋找演算法

二分尋找(binary search),也稱折半搜尋,是一種在 有序數組 中 尋找某一特定元素 的搜尋演算法。搜尋過程從數組的中間元素開始,如果中間元素正好是要尋找的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中尋找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組為空白,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

  • 時間複雜度:折半搜尋每次把搜尋地區減少一半,時間複雜度為O(log n)。(n代表集合中元素的個數)
  • 空間複雜度: O(1)。雖以遞迴形式定義,但是尾遞迴,可改寫為迴圈。
代碼描述遞迴
intbinarysearch(int array[], int low, int high, int target) {    if (low > high) return -1;    int mid = (low + high) / 2;    if (array[mid] > target)        return binarysearch(array, low, mid - 1, target);    if (array[mid] < target)        return binarysearch(array, mid + 1, high, target);    return mid;}
非遞迴
intbsearchWithoutRecursion(int a[], int key) {    int low = 0;    int high = a.length - 1;    while (low <= high) {        int mid = (low + high) / 2;        if (a[mid] > key)            high = mid - 1;        else if (a[mid] < key)            low = mid + 1;        else            return mid;    }    return -1;}
二分尋找法的缺陷

二分尋找法的O(log n)讓它成為十分高效的演算法。不過它的缺陷卻也是那麼明顯的。就在它的限定之上:必須有序,我們很難保證我們的數組都是有序的。當然可以在構建數組的時候進行排序,可是又落到了第二個瓶頸上:它必須是數組。

數組讀取效率是O(1),可是它的插入和刪除某個元素的效率卻是O(n)。因而導致構建有序數組變成低效的事情。

解決這些缺陷問題更好的方法應該是使用二叉尋找樹了,最好自然是自平衡二叉尋找樹了,既能高效的(O(n log n))構建有序元素集合,又能如同二分尋找法一樣快速(O(log n))的搜尋目標數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.