时间复杂度相关

一,时间复杂度

 

  

#引入问题 ! 如何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

转载请注明出处!

posted @ 2018-07-31 17:28  rianley  阅读(137)  评论(0编辑  收藏  举报