二分查詢(floor and ceil)

2021-10-03 00:21:19 字數 2265 閱讀 9017

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.如果待查詢...