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