• 算法--二分查找


    现有一个问题:

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

    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)

  • 相关阅读:
    mysql 添加自增长ID(序列方式)
    获取本地IP地址信息
    Intellij 快捷键
    java转换汉字为首字母搜索,
    gitee在linux下自动备份
    七牛云续费dns的ssl证书
    shiro 的realm的授权
    realme的shiro简单实现方法
    shiro初探,最简单的认证,通过ini文件。
    git config file
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/12891152.html
Copyright © 2020-2023  润新知