人工智能:怎样进行算法的复杂度分析?

复杂度分析是估算算法执行效率的方法,公式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/11019.html

赞 (0)
人工智能:Django中提供的常用列表页选项
上一篇 2023-05-12 02:42:28
下一篇 2023-05-12 02:43:34

相关推荐

  • 打造以文创为主题的青年创业基地 宝山区大场镇“创业义诊”走进

    打造以文创为主题的青年创业基地 宝山区大场镇“创业义诊”走进园区   记者了解到,截至目前,已有上海美术学院南院、毛戈平化妆培训中心等90多个创业企业组织入驻昇PARK文创产业园基地,此类“义诊”活动也是宝山区大场镇镇政府为创业青年提供精准化创业服务、引导和帮助青年树立创业意识、提高创业能力创业激情,吸引更多青年创业者到大场创业的重要举措之一。   这场在昇…

    创业分享 2023-06-01
  • 格丽顿集成墙饰怎么样?可以轻松开店创业

    版权声明(点击进入) ①长沙晚报报业集团书面授权星辰在线,在互联网上使用、发布、交流集团所属系列媒体的新闻信息。未经权利人授权,任何媒体、网站不得转载、摘编或利用其它方式使用长沙晚报报业集团任何作品。已经本网授权使用作品的,应在授权范围内使用,并注明“来源:星辰在线”或“来源:星辰在线-长沙晚报”。否则,本网将追究其相关法律责任。 ②本网未注明“来源:星辰在…

    创业分享 2023-05-31
  • 火凰再掀智能家居投资热潮,加盟商分享创业经验

    火凰再掀智能家居投资热潮,加盟商分享创业经验   智能家居到底有多火?现在不仅仅是各大企业纷纷使出浑身解数进入智能家居行业,而且广大市民在茶余饭后谈论的焦点也是智能家居。可以说,智能家居给我们的生活带来了无线的憧憬和向往,也让许多的投资者鼓足了劲,想要在这个行业里大展身手一番。   当前的时代,就是一个“大众创业,万众创新”的时代,投资创业成了时下热门的话题…

    创业分享 2023-05-23
  • 颠覆传统,魔法贝贝DIY百变童车给创业者更好平台!

    品牌:魔法贝贝DIY百变童车 公司:南京众创天下智能科技有限公司 其次材质也跟以前的童车不一样,魔法贝贝的童车采用高密度的铝合金材质。并且表面不涂抹任何的有害物质,更无难闻的异味。设计上符合人体工程学,圆角的设计也不会出现磕磕碰碰的现象,最大化的保证了孩子在使用玩耍中的安全。 现如今,越来越多的人开始抱怨钱难挣,装修建材行业受到了楼市下调的影响,实体店的小老…

    创业分享 2023-05-19
  • 澳洁干洗店加盟品牌:干洗创业如何选对品牌

    开业物品支持 一、怎么选干洗店加盟品牌? 选址敲定以后,澳-洁总部专业设计团队会为加盟商根据店铺面积、格局和加盟商意见设计装潢图纸。 二、干洗店加盟品牌哪个好? 店铺选址支持 说到干洗店加盟品牌,其实目前干洗行业中从事加盟的企业非常多,真正能称为品牌的却并不多。投资者在选择品牌的时候一定要小心谨慎,最好能亲自走访周边的同行或者品牌加盟店,多听听其他投资者和消…

    创业分享 2023-06-16

发表回复

登录后才能评论

联系我们

在线咨询: QQ交谈

邮件:362039258@qq.com

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