數據結構和算法----二分查找

  • 二分查找
  • 二分查找得定義
  • 假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。重複以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。
  • 二分查找的侷限性
  • 二分查找依賴得是順序表結構
  • 二分查找針對的是有序得數據
  • 小數據量優勢不大
  • 因依賴順序表結構,所以不太適合大量數據。因爲連續得大內存空間比較少。
  • 代碼
  • 二分查找
  • #查找出munlis中的下標
  • def run(lis,num):
  •     left = 0
  •     right = len(lis)-1
  •     while left <= right:
  •         middle = (right + left)//2
  •         if num == lis[middle]:
  •             return middle
  •         elif num < lis[middle]:
  •             right = middle - 1
  •         else:
  •             left = middle + 1
  •         return None
  • 查找第一個與data相等的數據
  •  def run(lis, data):
  •     left = 0
  •     right = len(lis) - 1
  •     while left <= right:
  •         middle = (left + right)//2
  •         if data<= lis[middle]:
  •             right = middle - 1
  •         else:
  •             left = middle + 1
  •         if lis[left] == data:
  •             return left
  • 查找最後一個與data相等得元素
  • def run(lis,data):
  •     left = 0
  •     right = len(lis) - 1
  •     while left <= right:
  •         middle = (left + right)//2
  •         if data < lis[middle]:
  •             right = middle - 1
  •         else:
  •             left = middle + 1
  •         if lis[right] == data:
  •             return right
  • 查找最後一個小於data的元素
  • def run(lis,data):
  •     left = 0
  •     right = len(lis) - 1
  •     while left <= right:
  •         middle = (left + right)//2
  •         if data <= lis[middle]:
  •             right = middle - 1
  •         else:
  •             left = middle + 1
  •         if data == lis[left]:
  •             return left-1
  • 查找第一個大於data的元素
  •             def run(lis,data):
  •                left = 0
  •                          right = len(lis) - 1
  •                while left <= right:
  •                    middle = (left + right)//2
  •                    if data < lis[middle]:
  •                       right = middle - 1
  •                    else:
  •                       left = middle + 1
  •                    if data == lis[right]:
  •                       return right+1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章