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

    现有一个问题:

      给一个列表,以及一个元素,返回: 元素的下表或未查找到元素

    1. 顺序查找

    从列表第一个元素开始,顺序进行搜索,直到找到为止。

    时间复杂度:O(n)

    2. 二分查找

    从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

    示例:列表[1,2,3,4,5,6,7,8,9],使用二分查找来查找3

    图一: 待查找值3与中间值mid比较

    图二: 候选区减少一半

    图三: 再次比较

    图四: 候选区再次减少一半

    图五: 最后要么找到,要么没有

    循环版本:

    善用low high mid mid+1 mid-1 ,比切片好, 时间度O(n)

    li = list(range(10))
    
    def foo(li, arg):                   # 时间复杂度: O(logn)
        low = 0
        high = len(li) - 1          # high/low是索引(下标)
        while low <= high:
            mid = (high + low) // 2
            if arg < li[mid]:
                high = mid - 1
            elif arg > li[mid]:
                low = mid + 1
            else:
                return mid
        return None
    
    print(foo(li, 3))
    # 3

    递归版本:

    def binary_search(lst, arg, low, high): 
        if low <= high:
            mid = (low + high) // 2
            if arg > lst[mid]:
                return binary_search(lst, arg, mid + 1, high)
            elif arg < lst[mid]:
                return binary_search(lst, arg, low, mid - 1)
            else:
                return mid
        else:
            return None
    
    
    li = list(range(10))
    print(binary_search(li, 3, 0, len(li) - 1))

    时间复杂度: O(logn)

  • 相关阅读:
    异常处理
    PAT——1048. 数字加密
    PAT——1047. 编程团体赛
    PAT——1046. 划拳
    PAT——1045. 快速排序(25)
    PAT——1044. 火星数字
    PAT——1043. 输出PATest
    PAT——1042. 字符统计
    PAT——1041. 考试座位号
    PAT——1040. 有几个PAT
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/12891152.html
Copyright © 2011-2022 走看看