怎样进行算法的复杂度分析?

复杂度分析是估算算法执行效率的方法,公式O(f(n))表示算法的复杂度,此方法即为大O复杂度表示法O(f(n))中n表示数据规模,f(n)表示运行算法所需要执行的指令数。

大O复杂度表示法

下面的代码非常简单,求 1,2,3…n 的累加和,我们要做的是估算它的执行效率。

def calc(n): sum_ = 0 for i in range(1,n+1): sum_ = sum_ + i return sum_

假设每行代码执行的时间都一样为t,执行第2行代码需要时间t,第3,4行代码运行了n遍,需要的时间为2n*t,这段代码总执行时间为(2n+1)* t

结论:代码执行的总时间T(n)与每行代码的执行次数成正比

看下面的代码,估算该段代码的执行时间:

def calc(n): sum_ = 0 for i in range(n): for j in range(n): sum_ = sum_ + i*j return sum_

同样假设每行代码执行的时间都一样为t:执行第2行代码需要时间t,第3行代码运行了n遍,需要时间为n*t,第4、5行代码运行了n2次,需要时间为2n2 * t,执行所有代码的总时间为 (2n2 + n + 1)* t。

结论:代码执行的总时间T(n)与每行代码的执行次数成正比。

用O(f(n))来表示算法复杂度:

def calc(n): sum_ = 0 for i in range(1,n+1): sum_ = sum_ + i return sum_def calc(n): sum_ = 0 for i in range(n): for j in range(n): sum_ = sum_ + i*j return sum_

T(n) = O(f(n)) , O表示代码的执行时间T(n) 与 f(n)表达式成比例。

大O复杂度表示法:上面例子中的T(n) = O(2n+1), 另一个 T(n) = O(2n² + n + 1)。大O时间复杂度并不表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。

当数据量特别大, 也就是n的取值很大的时候,大O表示法中低阶、常量、系数三部分并不会左右增长趋势,可以忽略。

def calc(n): sum_ = 0 for i in range(1,n+1): sum_ = sum_ + i return sum_def calc(n): sum_ = 0 for i in range(n): for j in range(n): sum_ = sum_ + i*j return sum_

上面例子中的T(n) = O(2n+1), 另一个 T(n) = O(2n² + n + 1),用大O表示法表示上面两段代码的时间复杂度,可以记为O(n),O(n²)。

算法A: O(n) 执行指令,10000*n

def calc(n): sum_ = 0 for i in range(1,n+1): sum_ = sum_ + I “”” 此处省略n行… … “”” return sum_

算法B: O(n²) 执行指令数,10*n2

对比上面两个算法,当 n = 10, n=100 时, 算法B执行的速度更快,n = 1000 时两者速度相当

n = 104 , n = 105, n = 106 ,算法A执行的速度更快的

随着数据规模的进一步增大, 这个差距会越来越大

时间复杂度分析

如何分析一段代码的时间复杂度?

在分析一个算法、一段代码的时间复杂度时,只关注循环执行次数最多的那一段代码就可以了。

def calc(n): sum_ = 0 for i in range(n): for j in range(n): sum_ = sum_ + i*j return sum_

上面的代码中,我们只需要关注内层for循环的时间复杂度就可以了,内层for循环的两行代码被执行了n2次,所以总的时间复杂度就是O(n²)

总复杂度等于量级最大的那段代码的复杂度

def calc(n): sum_ = 0 for i in range(1,n+1): sum_ = sum_ + i sum_1 = 0 for i in range(1,n+1): for j in range(n): sum_1 = sum_1 + i*j return sum_+sum_1

上面的代码分为两部分,分别是求 sum_、sum_1,计算sum_部分的代码段时间复杂度O(n),计算sum_1部分的代码段时间复杂度为O(n²) ,总的时间复杂度由复杂度最大的部分决定, 所以上面代码复杂度为O(n²)。

嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

def fn(n): sum_ = 0 for i in range(n+1): sum_ = sum_ + i return sum_ def calc(n): sum_ = 0 for i in range(n+1): sum_ = sum_ + fn(i) return sum_

上面的代码中第二个函数调用了第一个函数, 如果把fn函数调用当作一个普通操作, 那么第二个函数的时间复杂度为O(n) Fn函数的时间复杂度为O(n),那么函数整体的时间复杂度为O(n*n) = O(n²)。

当两段代码的数据规模不同时,不能省略复杂度低的部分

def calc(n): sum_ = 0 for i in range(1,n+1): sum_ = sum_ + i sum_1 = 0 for i in range(1,m+1): for j in range(m): sum_1 = sum_1 + i*j return sum_+sum_1

上面的代码分为两部分,分别是求 sum_、sum_1,计算sum_部分的代码段时间复杂度O(n),计算sum_1部分的代码段时间复杂度为O(m2) ,总的时间复杂度由复杂度最大的部分决定, 所以上面代码复杂度为O(m²+n)

免责声明:文章内容来自互联网,本站仅作为分享,不对其真实性负责,如有侵权等情况,请与本站联系删除。
转载请注明出处:怎样进行算法的复杂度分析? https://www.dachanpin.com/a/cyfx/11021.html

赞 (0)
上一篇 2023-05-12 02:42:54
苹果2024将推出无接口设计的iPhone?
下一篇 2023-05-12 02:43:59

相关推荐

  • 在郑州申请贷款被拒怎么办?试试满e融、融360和摩尔龙

      二、如何补救   查找原因   无论贷款人资质如何,总能通过满e融、融360和摩尔龙这类贷款信息平台,匹配到适合自己的贷款产品,银行和贷款人都能提高效率,这应该就是这类信息平台广受欢迎的原因吧。   进入2018年后,郑州地区各大银行都发布了最新的贷款政策,从目前的形式看,未来两三年内居民去杠杆将被提上日程,这意味着向银行申请贷款更难了!那么,在现实生活…

    创业分享 2023-05-19
  • 选择武汉味思特天下名吃创业路障总部摆平 渠道通达八方揽客

    总部拥有一支整容强大的研发团队,不断开发出贴合市场需求的新口味产品。助力品牌产品实时更新,复活吃货的味蕾。 媒体广告支持 严格执行区域保护政策,确保投资者利益最大化。提供成熟的营销推广体系培训,并派遣相关人员协助合作商成功开业。 持续不间断的通过在门户专业网站、主流媒体、杂志、报纸、户外广告、电视媒体等投放广告,提高品牌知名度以及品牌影响力。 总部吸取优化优…

    创业分享 2023-05-16
  • 第七届“云南青年创业省长奖”揭晓 获奖者捐出全部奖金

      “当前,我们正赶上一个创业创新的伟大时代。大众创业、万众创新的重点在青年,云南的希望在青年。”阮成发说,获奖青年们勇于投身市场经济大潮,敢闯敢干,成就了一番事业,实现了自我人生价值,也带动一大批人就业致富,为云南经济社会发展作出了积极贡献。   座谈会结束后,“云南青年创业省长奖”创业论坛举行,10名获奖者与大学生面对面,分享创业经历。   “云南青年创…

    创业分享 2023-05-23
  • 南山“创业之星”大赛开始报名

    深圳晚报讯 (记者 曾贤平) 5月18日下午,南山区人民政府召开创新南山2017“创业之星”大赛新闻发布会,发布了今年的办赛思路。据了解,本届大赛在做强行业赛的同时,将做大海外赛,在已有的美国、法国、英国、韩国等城市赛区的基础上开辟“一带一路”沿线国家的赛区,汇聚全球资源。 刘石明介绍,今年的赛事还重在“做强行业赛,做大海外赛”,强化社会市场的参与度。大赛将…

    创业分享 2023-05-23
  • 强化培训指导,喵鲜生让创业者不孤单

    发布时间:2018/09/14 10:46:23   餐饮行业前景一片大好,但不是随便开个店就能有良好效益的。喵鲜生为合作伙伴提供完善的培训支持,相信会让商家有良好的效益回报。 ②本网部分内容转载自其他媒体,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性。不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时, 必须保…

    创业分享 2023-05-16

发表回复

登录后才能评论

联系我们

在线咨询: QQ交谈

邮件:362039258@qq.com

工作时间:周一至周五,9:30-16:30,节假日休息