![](/img/trans.png)
[英]Finding the index of an element in a list. Binary search or use the index function?
[英]Binary search for lowest index of an element
我想實現一個二分搜索函數,它返回要搜索的元素的最低索引。 這是我的代碼:
def binarySearch(arr,x):
n=len(arr)
if n==1:
if arr[0]==x:
return 0
else:
return -1 # not in list
else:
m=int(n/2)
if x <= arr[m]:
return binarySearch(arr[:m],x)
else:
return m+binarySearch(arr[m+1:],x)
但是,這不能正常工作。 有人能幫我嗎?
def binarySearch(arr,x):
if len(arr) == 0:
return 0
else:
m=int(len(arr)/2)
if arr[m] == x:
c = 1
while arr[m-c] == x:
c += 1
return m-c+1
else:
if x < arr[m]:
return binarySearch(arr[:m],x)
else:
return binarySearch(arr[m+1:],x)
這可以解決您的問題,同時還為您提供最低的指數
時間復雜度: O(log(n))
空間復雜度: O(1)
def index_equals_value_search(arr):
left, right = 0, len(arr)-1
lowest = -float('inf')
while left<=right:
mid = (left+right)//2
print(mid, left, right, arr[mid])
if arr[mid] == mid:
lowest = min(lowest, mid)
right = mid-1
elif arr[mid]<0:
left = mid+1
elif arr[mid]<mid:
left = mid+1
elif arr[mid]>mid:
right = mid-1
if lowest == -float('inf'):
return -1
return lowest
arr = [-6,-5,-4,-1,1,3,5,7]
index_equals_value_search(arr)
您只需在函數的else
部分添加一個相等性測試,即可找到等於x
的元素的索引:
def binarySearch(arr,x):
n=len(arr)
if n==1:
if arr[0]==x:
return 0
else:
return -1 # not in list
else:
m = int(n/2)
if x < arr[m]:
return binarySearch(arr[:m],x)
elif x == arr[m]:
return m
else:
return m + binarySearch(arr[m+1:],x)
這可以防止通過@Fruitpunchsalami 提到的解決方案遞歸的問題
但是,這不會讓您獲得最低指數:
>>> binarySearch([1,2,3,3,4,4], 3)
3
這里的正確答案是 2。
由於-1
的特殊情況,另一個問題是處理未找到的元素。 我們得到:
>>> binarySearch([1,2,3,3,6,6], 4)
2
我很想提出一個通用的解決方案,您可以在其中找到小於x
的最大元素的索引,然后檢查位置上的元素。
可以在對數時間內找到小於x
的最大元素; 檢查右邊的元素是常數時間,所以你仍然得到 O(log n):
def binarySearch(arr,x):
'''Returns the lowest index of the element equal to `x` or NaN if not found.'''
def innerBinarySearch(arr, x):
'''Find index of largest element strictly less than `x`.'''
if len(arr) == 0:
return -1
m = len(arr) // 2
if x <= arr[m]:
return innerBinarySearch(arr[:m], x)
else:
return m + 1 + innerBinarySearch(arr[m + 1:], x)
idx = innerBinarySearch(arr,x) + 1
if 0 <= idx < len(arr) and arr[idx] == x:
return idx
return float('nan')
在一個函數中完成所有操作:
def binarySearch(arr,x):
'''Returns the lowest index of the element equal to `x` or NaN if not found.'''
if len(arr) == 0:
return float('nan')
m = len(arr) // 2
if arr[m] < x:
return m + 1 + binarySearch(arr[m + 1:], x)
elif x < arr[m] or (0 < m and arr[m-1] == x):
return binarySearch(arr[:m], x)
else:
return m
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.