演算法之二分查詢

2021-08-31 16:33:53 字數 3978 閱讀 1298

二分查詢針對的是乙個有序的資料集合,查詢思想有點類似分治思想,每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到想要查詢的元素,或是區間被縮小為0。

二分查詢的時間複雜度為o(l

ogn)

o(logn)

o(logn

) l og

nlogn

logn

是乙個非常恐怖的數量級,即使n非常大,對應的log

nlogn

logn

也很小。比如n等於2的32次方,這個數很大,大約42億。也就是說,我們在42億個資料中用二分查詢進行查詢,查詢到乙個元素只需要比較32次。

python:

def

main()

: s_raw =

input()

s_string = s_raw.split(

",")

s_num =

[int

(x)for x in s_string]

v =int(

input()

)print bsearch(s_num,0,

len(s_num)

, v)

defbsearch

(s, low, high, v)

: mid =

(low + high)/2

if s[mid]

== v:

return mid

elif v < s[mid]

: high = mid

return bsearch(s, low , high, v)

else

: low = mid

return bsearch(s, low, high, v)

main(

)

靜態:資料插入和刪除操作不頻繁

連續:資料必須是排序好的

陣列儲存:必須使用陣列儲存而非鍊錶儲存

1.查詢第乙個值等於給定值的元素

def

main()

: s_raw =

input()

s_list = s_raw.split(

",")

s =[int

(x)for x in s_list]

v =int(

input()

) low =

0 high =

len(s)-1

print

(bsearch(s, low, high, v)

)def

bsearch

(s, low, high, v)

:while

(low <= high)

: mid =

(low + high)/2

if s[mid]

> v:

high = mid -

1elif s[mid]

< v:

low = mid +

1else

:if mid ==

0or s[mid -1]

!= v:

return mid

else

: high = mid -

1return-1

main(

)

2.查詢最後乙個值等於給定值的元素

def

main()

: s_raw =

input()

s_list = s_raw.split(

",")

s =[int

(x)for x in s_list]

v =int(

input()

) low =

0 high =

len(s)-1

print

(bsearch(s, low, high, v)

)def

bsearch

(s, low, high, v)

:while

(low <= high)

: mid =

(low + high)/2

if s[mid]

> v:

high = mid -

1elif s[mid]

< v:

low = mid +

1else

:if mid ==

len(s)-1

or s[mid +1]

!= v:

return mid

else

: low = mid +

1return-1

main(

)

3.查詢第乙個大於等於給定值的元素

def

main()

: s_raw =

input()

s_list = s_raw.split(

",")

s =[int

(x)for x in s_list]

v =int(

input()

) low =

0 high =

len(s)-1

print

(bsearch(s, low, high, v)

)def

bsearch

(s, low, high, v)

:while

(low <= high)

: mid =

(low + high)/2

if s[mid]

< v:

low = mid +

1else

:if mid ==

0or s[mid -1]

< v:

return mid

else

: high = mid -

1return-1

main(

)

4.求迴圈有序陣列如4、5、6、1、2、3中的某個數(二分查詢)

def

main()

: s_raw =

input()

s_list = s_raw.split(

",")

s =[int

(x)for x in s_list]

v =int(

input()

) low =

0 high =

len(s)-1

print

(bsearch(s, low, high, v)

)def

bsearch

(s, low, high, v)

:while

(low <= high)

: mid =

(low + high)/2

if s[mid]

> v:

if s[low]

> v:

low = mid +

1else

: high = mid -

1elif s[mid]

< v:

low = mid +

1else

:return mid

main(

)

演算法之二分查詢

總時間限制 1000ms 記憶體限制 65536kb 描述在乙個非降序列中,查詢與給定值最接近的元素。輸入第一行包含乙個整數n,為非降序列長度。1 n 100000。第二行包含n個整數,為非降序列各元素。所有元素的大小均在0 1,000,000,000之間。第三行包含乙個整數m,為要詢問的給定值個數...

演算法之二分查詢

二分查詢演算法是運用分治策略的典型例子。給定一組已經排好序的n個元素a n 從這n個元素中找到乙個特定元素x。基本思想 將n 個元素劃分成個數大致相同的兩部分,取中間元素a n 2 與x進行比較 如果x a n 2 即找到x,演算法終止 如果x如果x a n 2 則只在陣列a的右半部分繼續查詢x。c...

演算法之二分查詢

模板 二分查詢模板 intbinarysearch int a,int left,int right,int target return 1 解決 尋找有序序列第乙個滿足條件的元素的位置 問題的模板 二分區間 left,right 必須覆蓋解的所有可能取值 intsolve int left,int...