python算法-二分法和大O表示法

版权声明:Shallow@版权所有 原创文章不经允许不得转载 https://blog.csdn.net/xili2532/article/details/90603924

二分法查找

二分法是针对于有序列表
使用简单查找法查找元素时,在最糟情况下需要查看每个元素。因此,如果列表包含8个数字,你最多需要检查8个数字。而使用二分查找时,最多需要检查log n个元素。如果列表包含8个元素,你最多需要
检查3个元素,因为log2 8 = 3(23= 8)。如果列表包含1024个元素,你最多需要检查10个元素,
因为log2 1024 = 10(2
10 =1024)
利用二分法找到猜想的数字:

import pysnooper

@pysnooper.snoop()
def binary_search(list, guess):
    low = 0
    high = len(list) - 1
    while True:
        mid = int((low+high)/2)
        result=list[mid]
        if result == guess:
            return mid
        elif result > guess:
            high = mid - 1
        elif result < guess:
            low = mid + 1

my_list = [1,3,5,7,9,11]
print(binary_search(my_list,11))

然而 算法效率的高低,主要取决于他的运行时间。
如果用简单查找逐个地检查数字,如果列表包含100个数字,最多需要猜100次。如果列表包含40亿个数字,最多需要猜40亿次。换言之,最多需要猜测的次数与列表长度相同,这被称为线性时间
如果用二分查找。如果列表包含100个元素,最多要猜7次;如果列表包含40亿个数字,最多需猜32次。二分查找的运行时间为对数时间(或log时间)。

大O表示法

大O表示法指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。大O表示法指的并非以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。
例如为检查长度为n的列表,二分查找需要执行log n次操作。使用大O表示法,这个运行时间就是O(log2 n)。
大 O 表示法指出了最糟情况下的运行时间
一些常见的大 O 运行时间
下面按从快到慢的顺序列出了你经常会遇到的5种大O运行时间。
 O(log n),也叫对数时间,这样的算法包括二分查找。
 O(n),也叫线性时间,这样的算法包括简单查找。
 O(n * log n),快速排序——一种速度较快的排序算法。
 O(n2),选择排序——一种速度较慢的排序算法。
 O(n!),一种非常慢的算法。
假设你要绘制一个包含16格的网格,且有5种不同的算法可供选择。如果你选择第一种算法,绘制该网格所需的操作数将为4(log 16 = 4)。假设你每秒可执行10次操作,那么绘制该网格需要0.4秒。如果要绘制一个包含1024格的网格呢?这需要执行10(log 1024 = 10)次操作,换言之,绘制这样的网格需要1秒。这是使用第一种算法的情况。第二种算法更慢,其运行时间为O(n)。即要绘制16个格子,需要执行16次操作;要绘制1024个格子,需要执行1024次操作。

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

猜你喜欢

转载自blog.csdn.net/xili2532/article/details/90603924