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)

  • 相关阅读:
    堆内存与栈内存
    struts2 ajax 实现方式
    Hibernate 配置派生属性
    高效 jquery 的奥秘
    对于Maven管理的项目制定虚拟目录
    ThreadLocal 笔记
    java Thread.join()
    vi 使用笔记
    浮动闭合方案:clearfix
    熬夜之弊及改善之法
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/12891152.html
Copyright © 2011-2022 走看看