python数据结构与算法学习自修第二天时间复杂度与大O表示法

Posted liuzhiqaingxyz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python数据结构与算法学习自修第二天时间复杂度与大O表示法相关的知识,希望对你有一定的参考价值。


#!/usr/bin/env python
#! _*_ coding:UTF-8 _*_

from Queue import Queue
import time

que = Queue()

time_begin = time.time()
# 如果a+b+c=1000, 且a^2+b^2=c^2,a,b,c为自然数,求出a,b,c所有的组合
# 使用枚举法计算结果
for a in range(1001):
    for b in range(1001):
        for c in range(1001):
            if a + b + c == 1000 and a**2 + b**2 == c**2:
                que.put({a:a, b:b, c:c})
time_end = time.time()

print "运行的时间为 %d, 求解的结果如下:" % (time_end-time_begin)
for item in range(que.qsize()):
    print que.get()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/bat_day1/abc.py
运行的时间为 124, 求解的结果如下:
{a: 0, c: 500, b: 500}
{a: 200, c: 425, b: 375}
{a: 375, c: 425, b: 200}
{a: 500, c: 500, b: 0}

Process finished with exit code 0

 

同样的问题,采用不同的算法,运行时间大大降低,如下:

#!/usr/bin/env python
#! _*_ coding:UTF-8 _*_

from Queue import Queue
import time

que = Queue()

time_begin = time.time()
# 如果a+b+c=1000, 且a^2+b^2=c^2,a,b,c为自然数,求出a,b,c所有的组合
# 使用枚举法计算结果
for a in range(1001):
    for b in range(1001):
        c = 1000 - a - b
        if a**2 + b**2 == c**2:
            que.put({a:a, b:b, c:c})
time_end = time.time()

print "运行的时间为 %d, 求解的结果如下:" % (time_end-time_begin)
for item in range(que.qsize()):
    print que.get()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/bat_day1/abc2.py
运行的时间为 0, 求解的结果如下:
{a: 0, c: 500, b: 500}
{a: 200, c: 425, b: 375}
{a: 375, c: 425, b: 200}
{a: 500, c: 500, b: 0}

Process finished with exit code 0

同样的问题,发现第一种算法用的时间为124S,第二种方法用的时间为不到1S;这就需要对不同的算法衡量运行效率;

如何衡量效率呢?运行效率不仅和运行时间有关,还和计算机的运行环境有关,同样的算法,在不同的计算机上执行,执行时间也是不一样的。

所以,运行效率应该用执行步骤相关,将执行步骤成为时间复杂度。

在第一种算法中:T(n) = n^3 * 2

在第二种算法中:T(n) = n^2 * 3

若不考虑系统和偏置项,则为渐进函数,使用渐进函数表示即为大O表示法:

在第一种算法中:T(n) = O(n^3)

在第二种算法中:T(n) = O(n^2)

 


以上是关于python数据结构与算法学习自修第二天时间复杂度与大O表示法的主要内容,如果未能解决你的问题,请参考以下文章

python数据结构与算法第十二天快速排序

Python学习之路第二天——迭代器生成器算法基础

学习python的第二天

莫烦scikit-learn学习自修第四天内置训练数据集

莫烦keras学习自修第四天分类问题

刷题打卡第二天(数组:快慢指针法)