資料結構專題之二分查詢

2021-09-29 15:26:35 字數 3998 閱讀 9810

什麼是二分查詢

二分查詢是電腦科學中最基本、最有用的演算法之一。 它描述了在有序集合中搜尋特定值的過程。

在最簡單的形式中,二分查詢對具有指定左索引和右索引的連續序列進行操作。這就是所謂的查詢空間。二分查詢維護查詢空間的左、右和中間指示符,並比較查詢目標或將查詢條件應用於集合的中間值;如果條件不滿足或值不相等,則清除目標不可能存在的那一半,並在剩下的一半上繼續查詢,直到成功為止。如果查以空的一半結束,則無法滿足條件,並且無法找到目標。

注意:

二進位制搜尋可以採用許多替代形式,並且可能並不總是直接搜尋特定值。有時您希望應用特定條件或規則來確定接下來要搜尋的哪一側(左側或右側)。

二分查詢中使用的術語:

二分查詢

給定乙個 n 個元素有序的(公升序)整型陣列 nums 和乙個目標值 target ,寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1。

示例 1:

輸入: nums = [-1,0,3,5,9,12], target = 9

輸出: 4

解釋: 9 出現在 nums 中並且下標為 4

示例 2:

輸入: nums = [-1,0,3,5,9,12], target = 2

輸出: -1

解釋: 2 不存在 nums 中因此返回 -1

class

solution

//sort

sort

(nums)

;int begin =0;

int end = nums.length -1;

while

(end >= begin)

else

if(nums[mid]

> target)

else

}return-1

;}void

sort

(int

nums)

for(

int j = nums.length -

1; j >

0; j--)}

void

swap

(int

arr,

int m,

int n)

void

addjustheap

(int

arr,

int i,

int length)

if(arr[k]

> temp)

else

} arr[i]

= temp;

}}

識別和模板簡介

如何識別二分查詢?

如前所述,二分查詢是一種在每次比較之後將查詢空間一分為二的演算法。每次需要查詢集合中的索引或元素時,都應該考慮二分查詢。如果集合是無序的,我們可以總是在應用二分查詢之前先對其進行排序。

成功的二分查詢的 3 個部分

二分查詢一般由三個主要部分組成:

3 個二分查詢模板

當我們第一次學會二分查詢時,我們可能會掙扎。我們可能會在網上研究數百個二分查詢問題,每次我們檢視開發人員的**時,它的實現似乎都略有不同。儘管每個實現在每個步驟中都會將問題空間劃分為原來的 1/2,但其中有許多問題:

模板 #1:

int

binarysearch

(int

nums,

int target)

else

if(nums[mid]

< target)

else

}// end condition: left > right

return-1

;}

模板 #1 是二分查詢的最基礎和最基本的形式。這是乙個標準的二分查詢模板,大多數高中或大學會在他們第一次教學生電腦科學時使用。模板 #1 用於查詢可以通過訪問陣列中的單個索引來確定的元素或條件。

關鍵屬性

區分語法

案例x 的平方根

實現int sqrt(int x)函式。

計算並返回 x 的平方根,其中 x 是非負整數。

由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。

示例 1:

輸入: 4

輸出: 2

示例 2:

輸入: 8

輸出: 2

說明: 8 的平方根是 2.82842…,

由於返回型別是整數,小數部分將被捨去。

class

solution

else

}return sqrt_x;

}}

猜數字大小

我們正在玩乙個猜數字遊戲。 遊戲規則如下:

我從 1 到 n 選擇乙個數字。 你需要猜我選擇了哪個數字。

每次你猜錯了,我會告訴你這個數字是大了還是小了。

你呼叫乙個預先定義好的介面 guess(int num),它會返回 3 個可能的結果(-1,1 或 0):

-1 : 我的數字比較小

1 : 我的數字比較大

0 : 恭喜!你猜對了!

示例 :

輸入: n = 10, pick = 6

輸出: 6

/* the guess api is defined in the parent class guessgame.

@param num, your guess

@return -1 if my number is lower, 1 if my number is higher, otherwise return 0

int guess(int num); */

public

class

solution

extends

guessgame

elseif(

guess

(mid)==1

)else

}return-1

;}}

模板 #2
int

binarysearch

(int

nums,

int target)

else

if(nums[mid]

< target)

else

}// post-processing:

// end condition: left == right

if(left != nums.length && nums[left]

== target)

return left;

return-1

;}

模板 #2 是二分查詢的高階模板。它用於查詢需要訪問陣列中當前索引及其直接右鄰居索引的元素或條件。

關鍵屬性

區分語法

案例模板 #3:

int

binarysearch

(int

nums,

int target)

else

if(nums[mid]

< target)

else

}// post-processing:

// end condition: left + 1 == right

if(nums[left]

== target)

return left;

if(nums[right]

== target)

return right;

return-1

;}

模板 #3 是二分查詢的另一種獨特形式。 它用於搜尋需要訪問當前索引及其在陣列中的直接左右鄰居索引的元素或條件。

關鍵屬性

區分語法 案例

資料結構之二分查詢

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

資料結構之二分查詢

上面我們介紹了順序查詢,但是它的時間複雜度為o n 讓人很受傷啊,所以有了二分查詢,二分查詢是乙個時間複雜度為o logn 的演算法,當然都是說的一般情況下,二分 二分,看名字就知道它的核心是什麼了,就是不斷地額逼近查詢值。include define max len 20 typedef stru...

資料結構之二分查詢

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