python学习 算法初步 时间复杂度与大O记法

算法是解决问题的方法,我们直接讨论问题:
如果a+b+c=1000,且 a^ 2 + b ^2=c ^2(a,b,c为自然数),如何求出所有可能的a,b,c组合?
#1.枚举法
#枚举法

import time #引入时间模块计算完成算法需要的时间
start_time = time.time()
for a in range(0,1001):
for b in range(0,1001):
        for c in  range(0,1001):
            if a+b+c==1000 and a**2+b**2==c**2 :
                print('a=%d,b=%d,c=%d'%(a,b,c))
end_time = time.time()
print('该程序花费时间:%d'%(end_time - start_time))
print('finished')

运行结果:
python学习 算法初步 时间复杂度与大O记法_第1张图片
我们发现,该程序运行需要花费很长的时间。

下面我们改进一下程序:


import time
start_time = time.time()
for a in range(0,1001):
    for b in range(0,1001):
        c = 1000-a -b  #c可以直接计算出值,减少一个for循环
        if a**2+b**2==c**2 : #if条件减少一个
                print('a=%d,b=%d,c=%d'%(a,b,c))
end_time = time.time()
print('该程序花费时间:%d'%(end_time - start_time))
print('finished')

结果:
python学习 算法初步 时间复杂度与大O记法_第2张图片
可以明显发现,所用的时间大大减少

那么问题来了,我们可以依据上述的内容判断两种算法的效率吗?
答案是否定的。如果在一台比较陈旧的计算机上,这两种算法的运行速度都会很慢,所以,判断算法效率,不可以依靠运行环境。

尽管我们在不同计算机上的运行时间不同,但相同的算法在不同运行环境下的基本运算数量会大体相同,所以我们将这些基本运算数量总和称为时间复杂度
时间复杂度定义:假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n) = O(g(n)),则称O(g(n))为算法A的渐进时间复杂度,简称时间复杂度,记为T(n)

现在我们分析一下第一个算法,
设时间复杂度为T
T = 1000 1000 10002
推广:当我们设a+b+c = N时,
T = N
NN2
所以,该算法的时间复杂度函数表示为:
T(n) = n^3*2

大O记法
当我们对算法效率进行分析时,最重要的是数量级和趋势,这些才是算法效率的主要部分,一些常数因子可以忽略,例如上文:T(n) = n^32,2 作为常数可以忽略。
**"大O记法"定义:对于单调的整数函数f,如果存在一个函数g和实常数从c>0,使得对于充分大的n总有f(n)<=c
g(n),就说函数g是f的一个渐进函数(忽略常熟),记为f(n)=O(g(n)),也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。**
所以g(n) = n^3,即g(n)是T(n)的渐进函数。

你可能感兴趣的:(算法)