goldEli / blog

Blog
MIT License
2 stars 1 forks source link

《图解算法》 #20

Open goldEli opened 4 years ago

goldEli commented 4 years ago

Go Back

goldEli commented 4 years ago

二分法(Binary Search)

有序数组中,快速找到某一项的位置,如果是遍历每一项的的话,时间复杂度就是O(n)。

如果取中间数比较大小,就可以过滤一半无用的数据,这样复杂度就会变成 logn。(log 就是对数,比如2^3 = 8,那么log8 = 3)

比如长度为8的数组 [1,3,5,6,8,12,32,71],用二分法找到 32 的位置:

arr = [1,3,5,6,8,12,32,71]
target = 32

def brinary_search(arr, target):
  start = 0
  end = len(arr) - 1
  mid = int((start + end) / 2)

  while mid < len(arr) or mid > -1:
    mid = int((start + end) / 2)
    guess = arr[mid]
    if guess == target:
      return mid
    if guess > target:
      end = mid - 1
    elif guess < target:
      start = mid + 1
  return None

print(brinary_search(arr, target)) # 6
goldEli commented 4 years ago

时间复杂度如何计算?