时间复杂度相关
一,时间复杂度
#引入问题 ! 如何a+b+c=1000,且 a^2+b^2=c^2,(a,b,c为自然数) 则a,b,c可能的组合!
import time
'''
枚举法解决
'''
# strat_time=time.time()
# 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:
# print(a,b,c)
# end_time = time.time()
# print(end_time-strat_time)
#改进
strat_time=time.time()
for a in range(1001):
for b in range(1001):
c=1000-a-b
if a**2+b**2 == c**2:
print(a,b,c)
end_time = time.time()
print(end_time-strat_time)
#时间复杂度 T(n)
'''
推导步骤
x =(具体的运算步骤) 系数不影响函数的走势
T =1000*1000*1000* x
T=2000*2000*2000* x n(代表的是 解决问题的规模)
T=N*N*N*x
T(n) = n^3*x
T(n) = g(n) 渐近函数 忽略系数x
T(n)= O(g(n))
T(n)=O(f(n)), 称 O(f(n))
严格定义:
"大0记法”:对于单调的蝥数函数f,如果存在一个S数函致g和实常数〇0,使得对于充分大的n总有f(n) <=c*g(n>,
就说函数g是f的一个渐近函数(忽輅常数),
记为f(n)=0(g(n))。也就是说,在趋向无穷的极限* 义下,
函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。
时间S杂度:假设存在函数g,使得篝法A处理规播为n的问應示例所用时间为T(n)=0(g〇J),则称0(g(n))为 *法A的渐近吋间复杂度,简称时间复杂度,记为T<nJ
二 最坏时间复杂度
#引入问题 ! 如何a+b+c=1000,且 a^2+b^2=c^2,(a,b,c为自然数) 则a,b,c可能的组合!
'''
分析算法时.存在几种可能的考虑:
•算法宪成工作最少需要多少基本操作,即最优时间复杂度
•算法宪成工作最多需要多少墨本操作,即最坏时间复杂度
•算法完成工作平均需要多少基本操作.即平均时间复杂度
对于最优时间复杂度,其价值不大,因为它没有提供什么有用倌息.其反映的只ft最乐观最理想的情况,没 有参考价值,
对于最坏时间霣杂度,提供了一种保证,表明算法在此种程度的®本操作中一定能完成工作,
对于平均时间复杂度.是对算法的一个全面评价,因此它完螯全面的反映了这个算法的性质#
但另一方面. 这种衡屋并没有保证,不*每个计算都能在这个基本操作内完成。
而且,对于平均情况的计算,也会因为应 用算法的实例分布可能并不均匀而难以计算》
因此,我们主要关注算法的嚴坏悄况,亦即最坏时间复杂度_
时间复杂度的几条基本计算规则
1. 基本操作.即只有常数项,认为其时间复杂度为O(1}
2. 顺序结构,时间复杂度按加法进行计算
3. 循环结构(循环结构),时间复杂度按算法进行计算
4. 分支结构(条件语句),时间复杂度取最大值 \
5. 判断一个算法的效率时,往往只需要关注操作数量的B高次项.其它次要项和常数项可以忽略
6. 在没有特殊说明时.我们所分析的算法的时间复杂度都是指 ‘最坏时间复杂度’
'''
import time
strat_time=time.time()
for a in range(1001):
for b in range(1001):
c=1000-a-b
if a+b+c==1000 and a**2+b**2 == c**2:
print(a,b,c)
end_time = time.time()
print(end_time-strat_time)
#计算改进后的时间复杂度
'''
T(n) =n*n*(1+max(1,0))
= n^2*2
=O(n^2)
'''
三,常见的时间复杂度与大小关系
''' 常见时间复杂度 执行次数函数举例 阶 非正式术语 12 0(1) 常数阶 2n+3 O(n) 线性阶 3n2+2n+1 O(n^2) 平方阶 5log2n+20 O(logn) 对数阶 2n+3nlog2n+19 O(nlogn) nlogn 阶 6n3+2n2+3n+4 O(n^3) 立方阶 2n 0(2^n) 指数阶 "注意,经常将log2n (以2为底的对数)简写成logn" '''
图解:

本文作者:rianley cheng
作者QQ:2855132411
转载请注明出处!

浙公网安备 33010602011771号