zoukankan      html  css  js  c++  java
  • 二分查找

    二分查找:

     每次能够排除掉一半的数据. 查找的效率非常高. 但是局限性比较大.  要求: 查找的序列必须是有序序列

    # 判断n是否在lst中出现. 如果出现请返回n所在的位置
    # 二分查找---非递归算法
    def bin_search(li, val):
      low = 0
      high = len(li)-1
      while low <= high: # 只要候选区不空,继续循环
        mid = (low + high) // 2
        if li[mid] == val:
          return mid
    elif li[mid] < val:
          low = mid + 1
        else: # li[mid] > val
          high = mid - 1
      return -1
    
    
    普通递归版本二分法
    def binary_search(n, left, right):
     if left <= right:
     middle = (left+right) // 2
     if n < lst[middle]:
    right = middle - 1
     elif n > lst[middle]:
     left = middle + 1
     else:
     return middle
     return binary_search(n, left, right) # 这个return必须要加. 否则接收
    到的永远是None.
     else:
     return -1
    print(binary_search(567, 0, len(lst)-1))
    # 另类⼆分法, 很难计算位置.
    def binary_search(ls, target):
     left = 0
     right = len(ls) - 1
     if left > right:
     print("不在这⾥")
     middle = (left + right) // 2
     if target < ls[middle]:
     return binary_search(ls[:middle], target)
     elif target > ls[middle]:
     return binary_search(ls[middle+1:], target)
     else:
     print("在这⾥")
    binary_search(lst, 567)
    时间复杂度最低, 空间复杂度最低
    lst1 = [5,6,7,8]
    lst2 = [0,0,0,0,0,1,1,1,1]
    for el in lst1:
        lst2[el] = 1
    
    lst2[4] == 1   # o(1)
  • 相关阅读:
    混杂模式
    消息队列学习
    item21
    消息队列改写
    socket select模型
    EffectiveC++ Item11
    How to read a PCap file from Wireshark with C++
    winsock select学习
    线程安全与可重入函数
    process explorer 查看句柄或者加载的dll
  • 原文地址:https://www.cnblogs.com/feifeifeisir/p/9483788.html
Copyright © 2011-2022 走看看