詳解二分查詢,二分查詢基礎教程 高階練習

2021-09-13 23:39:39 字數 2311 閱讀 8557

二分查詢,就是通過每次將查詢範圍縮小一半的方法,最終鎖定目標。話不多說,直接看最基礎的二分查詢模型

輸入:乙個有序陣列,int arr

乙個目標值,int key

輸出:目標值的索引位置

二分查詢本質上是乙個遞迴查詢的過程,每一次的遞迴運算分三步

第一步,判斷陣列的正中心(center)是否為key,如果是,輸出結果,如果不是,進入下一步

注:當陣列size為偶數,也就是說沒有中心的時候,我們任選中心兩個資料之一作為中心

在這個例子中,顯然中心arr[8]不等於key

第二步,判斷key在center的左邊還是右邊

因為這是乙個有序陣列,我們可以通過判斷大小,判斷左右。在這個例子中key第三步,在左邊,將陣列右端點更新為center;在右邊,將陣列的左端點更新為center。遞迴

這時我們可以忽略掉arr[8]已經其之後的資料,在下一次的遞迴中,在0-7的範圍內重複上面的過程。

**實現:

public

class

binarysearch

private

static

intbinarysearch

(int

arr,

int key,

int left,

int right)

}

當然,使用while迴圈同樣可以完成,這裡不再贅述

有n根繩子,第i根繩子長度為li,現在需要m根等長的繩子,你可以對n根繩子進行任意裁剪(不能拼接),請你幫忙計算出這m根繩子最長的長度是多少。

輸入:繩子根數int n

需要的繩子根數int m

儲存著每根繩子長度的陣列int lengths

輸出:最長的長度l

假設最終結果l是在乙個範圍內,這樣,我們只需要通過二分查詢,就能找到l。為了實現二分查詢,我們需要確定三個東西:

l所在的範圍

l需要滿足的條件(用於判斷是否已經找到)

查詢精度(和基礎模型不同,我們的查詢並非是在乙個陣列中查詢,而是在乙個數字區間內查詢,所以我們需要乙個查詢精度,用來將數字區間轉化為步長為精度的陣列)

當我們判斷乙個l滿足條件1時,那麼他就是合法的,我們只想要更大的l,也就是說,目標值一定大於等於當前l,所以我們只需要不斷向右尋找即可。而當l不滿足條件1時,說明l過長,我們只需要向左尋找。這樣,二分條件就完成了。

public

static

double

binarysearch

(int

arr,

int n,

int m)

double mid =

(left + right)/2

;while

(right - left < esp)

return mid;

}private

static

boolean

islegal

(int

arr,

double mid,

int m,

int n)

return amount >= m;

}

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...

二分查詢詳解

演算法概括 二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將...

二分查詢詳解

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。假設我們比較的有序數列有三個數,我們比較乙個元素的值和陣列中間位置的元素的值進行比較,如果比中間的元素大,則在有序陣列的後半部分進行查詢 如果中間...