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

复杂度分析是估算算法执行效率的方法,公式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
下一篇 2023-05-12 02:43:59

相关推荐

  • 放弃京城高薪返乡创业 龚华丽:

    经过无数次的试验,龚华丽掌握了多肉繁育种植和养护技术,不管是温度调节,还是营养土配制、多肉嫁接和多肉造型搭配,她都非常娴熟。现在30平方米的阳光房里,摆放着中高端精养多肉花卉近300个品种。 龚华丽销售多肉花卉主要是通过网上渠道,在朋友圈、抖音等平台发布销售信息,开通直播,为消费者提供个性化产品和服务,销售旺季每天能卖1万多元,年销售额已达100万元。 今年…

    2023-05-13
    75
  • 3次创业成功的经历 他把这一切归因于“机遇”

    后来通过打听的方式找到武汉大学的数学家和密码小组研究ECC密码算法,成为国家密码标准算法的模型,换股到香港中国电子,成为股东。 打听一下是一个相较于机遇线下约见更轻量化的社交行为,它不再受时间空间的约束,而且话题也可以更细微和生活化。它们共同依赖于平台沉淀的用户关系,但打听一下的用户范围会相对更广一些,它能连接到更多用户,以往线下约见不起商业领袖的人可以在线…

    创业分享 2023-05-24
    84
  • [走,回家创业!]一场生态循环农业的试验

      央广网内江5月9日消息(记者刘柏煊)据中国之声《新闻纵横》报道,随着乡村振兴战略的实施,返乡创业成为越来越多人的选择。在生态循环农业的模式下,一根秸秆就串起了农场里的所有种养产业,昔日沉睡的荒地又恢复了生机。中央人民广播电台推出系列报道《走,回家创业!》,今天推出第三篇《一场生态循环农业的试验》。 返乡创业者李安潮(央广网记者刘柏煊 摄)   创业者——…

    2023-05-18
    68
  • 华氏老街坊特色火锅加盟:开启您创业致富第一步!

    华氏老街坊特色火锅加盟:开启您创业致富第一步! 2019-03-28 11:24:38 来源:北国网       未曾遇见华氏老街坊特色火锅加盟之前,我是一个经商失败者。每天为了生计在社会上劳累奔波,拿着微不足道的薪水。看着身边的朋友一个个生活水平变得越来越高,事业也越来越有起色,我不是没有羡慕过,但经历过经商失败的我深深的知道…

    创业分享 2023-05-13
    60
  • 精英们请注意!看看创业公司是怎么套路你们的

      顶尖人才成就优秀公司。从公司创立之初就跟着你并肩作战的员工难能可贵,因为他们具有创业精神;而有着曾在大公司工作经历的员工能提升你公司的发展空间。   Victor Ho是FiveStars的联合创始人兼CEO,他认为一流公司出来的员工能够延续曾经的习惯为公司带来良好风气。FiveStars是一款忠实营销(在营销时,以培养顾客的忠诚度作为主要诉求点)应用,…

    创业分享 2023-05-29
    71

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信