zoukankan      html  css  js  c++  java
  • 【算法】二分查找法&大O表示法

    二分查找

    基本概念

    •   二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null。
    •   使用二分查找时,每次都排除一半的数字
    •   对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步。
    •   示例:

        如果列表包含8个数字,你最多需要检查8个数字。

        而使用二分查找时,最多需要检查log n个元素。如果列表包含8个元素,你最多需要检查3个元素,因为log 8 = 3( 23 = 8)。

      注意:仅当列表是有序的时候,二分查找才管用

    •   数组:将一系列元素存储在一系列相邻的桶(bucket),即数组。数组从0开始编号:位置依次分别为#0,#1….

    python算法

    def binary_search(l,item):
        low=0
        high=len(l)-1
        while low<=high:
            mid=(low+high)//2
            guess=l[mid]
            if guess==item:
                return mid
            if guess>item:
                high=mid-1
            else:
                low=mid+1
        return None
    
    my_list=[1,3,5,7,9]
    print(binary_search(my_list,3))
    print(binary_search(my_list,-3))
    
    运行结果:
    1
    None
    

      

    运行时间

    •   一般而言,应选择效率最高的算法,以最大限度地减少运行时间或占用空间。
    •   最多需要猜测的次数与列表长度相同,这被称为线性时间(linear time)。
    •   二分查找的运行时间为对数时间(或log时间)
    •   示例:

        列表包含100个数字,简单查找最多需要猜100次。二分查找最多需要7次

        O(n):线性时间

        O(log n):对数时间

    大O表示法

    大O表示法是一种特殊的表示法,指出了算法的速度有多快

    算法的运行时间以不同的速度增加

    •   二分查找和简单查找的运行时间的增速不同
    •   示例:

    元素个数

    简单查找

    二分法查找

    100个元素

    100ms

    7ms

    10000个元素

    10s

    14ms

    1000000000个元素

    11day

    32ms

      随着元素数量的增加,二分查找需要的额外时间并不多,而简单查找需要的额外时间却很多。

      因此,随着列表的增长,二分查找的速度比简单查找快得多。

    •   大O表示法用处:仅知道算法需要多长时间才能运行完毕还不够,还需知道运行时间如何随列表增长而增加。
    •   大O表示法是为了能够比较操作数,它指出了算法运行时间的增速。

        如:假设列表包含n个元素,

          简单查找:需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。无单位。

          二分查找:需要执行log n次操作。使用大O表示法,这个运行时间为O(log n)

    •   大O表示法格式:O(n),n为操作数
    •   大 O 表示法指出了最糟情况下的运行时间

    常见的大O运行时间

    •   5种大O运行时间

         O(log n),也叫对数时间,这样的算法包括二分查找。

         O(n),也叫线性时间,这样的算法包括简单查找。

         O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。

         O(n2),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。

         O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法

      PS:

    •   算法的速度指的并非时间,而是操作数的增速。
    •   谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
    •   算法的运行时间用大O表示法表示。
    •   O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。

    阶乘时间

    阶乘时间:需要执行n!(n的阶乘)次操作才能计算出结果,运行时间为O(n!)

    小结

    • 二分查找的速度比简单查找快得多。
    • O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
    • 算法运行时间并不以秒为单位。
    • 算法运行时间是从其增速的角度度量的。
    • 算法运行时间用大O表示法表示。
  • 相关阅读:
    pandas 修改列顺序
    read_csv,to_csv 前n行
    郭盛华:未来黑客攻击的将远不止网络
    微软的 Linux 存储库停机 18 多个小时
    警惕黑客利用 Google Docs进行网络钓鱼
    苹果发布紧急补丁!修复被黑客利用的2个零日漏洞
    谷歌发布新框架以防止软件供应链攻击
    郭盛华:以知识见识锤炼真本领,年轻人要有理想
    通过 GDPR 加强密码政策,是企业网络的第一道防线
    肉类供应商遭黑客攻击,并支付了 1100 万美元的赎金
  • 原文地址:https://www.cnblogs.com/lilip/p/9481470.html
Copyright © 2011-2022 走看看