python二分查詢模板

whisperrr發表於2021-09-01

  經常會遇到需要進行二分查詢的情境,python中的bisect很好用,當無法使用這個庫的時候,可以自己手動實現。

  下面的程式碼片段實現了“查詢target第一次出現的位置”,以及“第一個大於target的值的位置”兩個功能,如果要找target最後一次出現的位置,可以在“第一個大於target的值的位置”的基礎上減一。

  如果第一次查詢11,left和right都等於7(即陣列的長度,因為11不存在於陣列arr中),需要手動判斷。

  下面的程式碼適用於劍指offer《在排序陣列中查詢數字》

  import bisect

  arr = [5, 7, 7, 8, 8, 9, 10]

  # i,j輔助使用

  i, j = 0, len(arr)

  # left、right是需要搜尋的

  # left表示第一個等於target的值的位置

  # right表示第一個大於target的值的位置

  left = 0

  right = len(arr)   大連婦科醫院哪個好  

    # 目標值,假設需要找到陣列中第一個等於8的值,以及第一個大於8的值

  target = 8

  # i永遠等於mid加1

  # j永遠等於mid

  # 當搜尋left時,第一個條件為arr[mid]<1target:i=mid+1<1 p="">

  # 當搜尋left時,第一個條件為target<1arr[mid]:j=mid<1 p="">

  while i < j: mid = (i + j) // 2 if arr[mid] < target: i = mid + 1 left = i else: j = mid

  i = 0

  j = len(arr)

  while i < j: mid = (i + j) // 2 if target < arr[mid]: j = mid right = j else: i = mid + 1

  # 可以看到結果相同,第一次出現8的位置是3

  print(bisect.bisect_left(arr,8))

  print(left)

  # 可以看到,第一次大於8的位置是5

  print(bisect.bisect_left(arr,9))

  print(right)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70005147/viewspace-2789882/,如需轉載,請註明出處,否則將追究法律責任。

相關文章