二分查詢總結

2021-10-01 08:51:19 字數 3268 閱讀 1542

二分查詢也稱折半查詢(bi

nary

sear

ch

)(binary \;search)

(binar

ysea

rch)

,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。

第一次寫部落格,之所以選這個演算法是因為第一次面試問了這個題,自己學習的時候也沒認真看,結果出現了一些問題,所有在這裡總結一下。

leetcode 35. 搜尋插入位置

你可以假設陣列中無重複元素。

在面試前,我遇到二分查詢是直接用遞迴來寫的,結果面試的時候面試官直接說別用遞迴,因為遞迴比較耗資源(函式棧)。但我還是先把遞迴解法寫一下。

class

solution

private

intsearchinserthepler

(int

nums,

int target,

int start,

int end)

mid =

(start + end)/2

;if(target > nums[mid]

)return

searchinserthepler

(nums, target, mid +

1, end)

;return

searchinserthepler

(nums, target, start, mid);}

}

遞迴解法時間複雜度o(l

ogn)

o(logn)

o(logn

),空間複雜度o(l

ogn)

o(logn)

o(logn

)。其實上述用的是尾遞迴(也是面試的時候才知道的),因此經過編譯器優化後空間複雜度也是o(1

)o(1)

o(1)

,但還是推薦用下面的迭代解法。

迭代解法可以將空間複雜度降到o(1

)o(1)

o(1)

class

solution

return i;

}}

給定乙個按照公升序排列的整數陣列 num

snums

nums

,和乙個目標值 tar

ge

ttarget

target

。找出給定目標值在陣列中的開始位置和結束位置。

你的演算法時間複雜度必須是o(l

ogn)

o(logn)

o(logn

) 級別。

如果陣列中不存在目標值,返回 [−1

,−1]

[-1, -1]

[−1,−1

]。

class

solution

; answer =

newint[2

];answer[0]

=getminindex

(nums, target);if

(answer[0]

==-1)

else

return answer;

}private

intgetminindex

(int

nums,

int target)

else

}return nums[i]

== target ? i :-1

;}private

intgetmaxindex

(int

nums,

int target)

else

}return i;

}}

這道題用了兩次二分查詢分別找出了陣列中 tar

ge

ttarget

target

第一次和最後一次出現的位置,兩個函式中不同的乙個地方是用了

mid =

(i + j)/2

;

mid =

(i + j +1)

/2;

區別是什麼呢?當 [i,

j]

[i, j]

[i,j

] 的長度是奇數時,兩種寫法都是區最中間的那個數;不同的是當長度是偶數時,前者是取中間靠左的那個數,後者是取靠右的那個數。

編寫乙個高效的演算法來判斷 m×n

m\times n

m×n矩陣中,是否存在乙個目標值。該矩陣具有如下特性:

每行中的整數從左到右按公升序排列。

每行的第乙個整數大於前一行的最後乙個整數。

示例 1:

輸入:mat

rix=

[135

710

1116

2023

303450]

targ

et=3

matrix = \left[ \begin 1 & 3 & 5 & 7 \\ 10 & 11 &16&20 \\ 23&30&34&50\\ \end\right]\\target = 3

matrix

=⎣⎡​

1102

3​31

130​

5163

4​72

050​

⎦⎤​t

arge

t=3輸出: tru

etrue

true

class

solution

else

} k = i;

if(matrix[k][0

]== target)

return

true

; i =0;

j = n -1;

while

(j > i)

else

}return matrix[k]

[i]== target;

}}

兩次二分查詢,時間複雜度為 o(l

ogm+

logn

)=o(

log(

mn))

o(logm+logn)=o(log(mn))

o(logm

+log

n)=o

(log

(mn)

)

二分查詢總結

今天上csdn,發現一篇關於二分查詢演算法的文章被置頂,回帖也相當熱烈。我覺得演算法總重要的還是要了解思想,至於程式設計技巧則是其次。二分查詢在計算中演算法中的重要性不言而喻,許多變形的演算法都是基於此演變的,比如二分查詢樹等。所以此演算法程式我也打算總結一下。當然經典的演算法討論莫過於jon be...

二分查詢總結

我們假設乙個最簡單的環境,對於數x,按要求詢問它在乙個陣列a 假設從小到大 裡的位置,陣列個數為n。1.查詢最後乙個小於x的數的位置 常見的一種要求。返回小於x的其中的最右邊乙個數的下標。int half int x return r 2.查詢最後乙個小於或等於x的數的位置 返回小於或等於x的其中的...

二分查詢總結

二分查詢其實並不簡單 這個演算法有很多版本 而且變化也比較多 稍一不留神就容易寫錯 這裡總結一下 一般二分查詢 binary serach int f int array,int key,int len else cout return 1 注意判斷條件必須要這麼寫 因為比如奇數個元素 1,3,5 ...