import math
deffloor
(arr, target)
:'''
在有序陣列arr中, 查詢target
如果找到target, 返回第乙個target相應的索引index
如果沒有找到target, 返回比target小的最大值相應的索引, 如果這個最大值有多個, 返回最大索引
如果這個target比整個陣列的最小元素值還要小, 則不存在這個target的floor值, 返回-1
'''left =-1
right =
len(arr)-1
while left < right:
# 向上取整避免死迴圈,也可使用:mid = left - (left - right) // 2 替換
mid = left + math.ceil(
(right - left)/2
)if arr[mid]
>= target:
right = mid -
1else
: left = mid
# 如果該索引+1就是target本身, 該索引+1即為返回值
if left+
1<
len(arr)
and arr[left+1]
== target:
return left +
1# 否則, 該索引即為返回值
return left
# left = 0
# right = len(arr) - 1
# while left < right:
# # mid = left + math.ceil((right - left) / 2)
# mid = left - (left - right) // 2
# if arr[mid] >= target:
# right = mid - 1
# else:
# left = mid
# if arr[left] == target:
# return left #
# elif left < len(arr)-1 and arr[left+1] == target:
# return left+1
# elif arr[left] > target:
# return -1
# else:
# return left
defceil
(arr, target)
:'''
二分查詢法, 在有序陣列arr中, 查詢target
如果找到target, 返回最後乙個target相應的索引index
如果沒有找到target, 返回比target大的最小值相應的索引, 如果這個最小值有多個, 返回最小的索引
如果這個target比整個陣列的最大元素值還要大, 則不存在這個target的ceil值, 返回整個陣列元素個數n
'''left, right =0,
len(arr)-1
while left < right:
mid = left +
(right - left)//2
if arr[mid]
<= target:
left = mid +
1else
: right = mid
# 如果該索引-1就是target本身, 該索引-1即為返回值
if right-
1>=
0and arr[right-1]
== target:
return right -
1# 否則, 該索引即為返回值
return right
arr =[1
,1,1
,2,2
,2,2
,2,4
,4,5
,5,5
,6,6
,6]print
(floor(arr,2)
)# output: 3
print
(ceil(arr,2)
)# output: 7
print
(floor(arr,3)
)# output: 7
print
(ceil(arr,3)
)# output: 8
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
1128 二分 二分查詢
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...
二分查詢及變種二分查詢
二分查詢也稱折半查詢 binary search 它的查詢效率很好。二分查詢有乙個要求是必須採用順序儲存結構,而且表種的元素是有序的。只有滿足這個條件我們才能使用二分查詢。查詢條件 查詢區域的左邊界,小於等於查詢區域的右邊界 查詢過程 1.迴圈條件 查詢條件 2.計算序列中間下標位置 3.如果待查詢...