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

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

相关推荐

  • 程序员在写一种很新的代码,笑不活了(附源码)

    嗨,黑马粉丝,程序员在你的印象中,是什么样的人呢? 高冷?高薪?高智商?今天播妞不说他们这些广为人知的特征,而要说另外一种特质——幽默。 程序员常年和电脑打交道,难免让人误以为他们不善言辞,自然也和幽默联系不起来,但是,只要你走进他们的代码,幽默的一面就会“暴露无遗”。 不信,你看下面这些注释 01 不能明怼,就在代码中吐槽 /* *在这个破地方 *还原度要…

    2023-05-12
    80
  • 婚外情对婚姻家庭中配偶权的保护

     离婚率居高不下,婚外恋现象愈演愈烈,与之伴随的家庭破裂,夫妻反目,因为婚外恋而导致离婚的占离婚案件的80%。婚外恋是当今社会中的一个较普遍现象,大多数人对婚外恋持否定和反对态度。婚外恋现象在中国的现实生活中是复杂的,不能采取简单的处理方式,关键是提高婚姻的质量。尽管婚姻质量有待提高,但是爱情婚姻仍是主流。同时,《婚姻法》也明确规定,人们完全可以通…

    创业分享 2023-05-13
    86
  • 瞄准原生态 下岗职工创业当老板-永川新闻-永川网

    现在生活条件好了,大家饮食都希望健康、生态,这么好的东西,为什么不带回永川呢?在一次和好朋友陈泓利的聊天中,陈如清的想法立刻得到这位20多年好朋友的支持。“其实当时陈泓利心里也没有底,但是他有独特眼光,还有市场把握能力,通过他夫妻亲自驾车到滇缅边境寨子实地考察,很有发展信心。加之我们在那边,也有朋友关系。”陈如清说。随后,又有两个朋友加入陈泓利和陈如清的 “…

    创业分享 2023-05-21
    162
  • 天使轮,四家科技类创业公司正在融资

      启迪之星的几千家孵化、投资的企业中,有很多优质企业处在融资阶段,需要寻找认同他们事业的投资人。因此,启迪之星定期将有融资需求的企业,推荐出来,希望他们更快速的找到“创业伴侣”,一起在共同选择的事业上走的更远。   本期推荐的4家企业,他们均处于种子、天使轮阶段。   【 机器之声】   核心竞争力   机器之声研发的精灵果果儿童光感可穿戴产品可检测儿童全…

    创业分享 2023-06-06
    49
  • 以太资本:珍爱创业 远离这7类投资人的套路!

      投融资就像结婚,无论创业者还是投资人,都必须选择最靠谱的彼此,作为连接双方最靠谱的“红娘”,以太资本自成立以来,已经为超过350个项目顺利完成融资,融资总金额逾13亿美元,覆盖早期投资人多达7700多位。   顺利获得融资是每一个创业者最大的梦想,然而创投圈里,“以投资为名花式揩油(包括骗吃骗喝、借钱不还甚至骗人劫色等等),并向创业者翻了一个白眼”的惨剧…

    创业分享 2023-05-30
    145

发表回复

登录后才能评论

联系我们

在线咨询: QQ交谈

邮件:362039258@qq.com

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