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

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

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年5月8日 01:07
下一篇 2023年5月8日 01:07

相关推荐

  • 石榴算法的名称由来,有什么影响呢?

    现在是网络发展时代,很多关于网络流通下的产物都会有一定的打击手段,其中石榴算法就是百度针对低质量网站的进一步打击的升级版。我们对此有什么样的了解呢? 石榴算法简介 2013年5月17日下午,百度网页搜索反作弊…

    2022年5月21日
    0336
  • 小编分享百度算法一直在变,要不断更新SEO方法。

    网站优化的方法一直在变,有可能今天的网站优化方法可能明天就不再适用了,因此我们需要与时俱进,不断去研究搜索引擎的变化,不断去学习新的技能,这样我们才能让我们的网站和品牌有更大的价值。下面是一些新手seo…

    2023年6月29日
    04
  • 怎样进行算法的复杂度分析?

    复杂度分析是估算算法执行效率的方法,公式O(f(n))表示算法的复杂度,此方法即为大O复杂度表示法O(f(n))中n表示数据规模,f(n)表示运行算法所需要执行的指令数。大O复杂度表示法下面的代码非常简单,求 1,2,3…n 的累…

    2023年5月8日
    00
  • 我来分享惊雷算法后搜索引擎优化如何做。

    搜索引擎优化技术伴随着互联网的发展快速崛起,但搜索引擎优化究竟路在何方,特别是惊雷算法后却让许多站长迷茫彷徨,以下几个方面说下现阶段搜索引擎优化现状如何。1、用户体验百度白皮书已经明确表达了对用户体验…

    2023年6月30日
    02
  • 教你2018百度seo最新算法大全。

    算法是有维度的,做网站优化的时候,接近甚至于等于相关维度,就会有理想的关键词排名。稀里糊涂做内容,做外链的结果是结果模糊。百度已经公开了很多算法,但还有未公开的,本文小编小编就2018百度最新算法,做一…

    2023年6月20日 运营推广
    017
  • 小编教你2017全年百度、360搜索算法大回顾。

    2022年对于站长们来说,是不太好过的一年,搜索引擎的计划、算法格外的多! 百度带着大自然系命名的算法来了5次;360那边也不甘示弱,组了个西游记班子,4度来袭。 这样间隔一段时间就来一发算法调整的高频率,较往…

    2023年6月27日 运营推广
    00
  • 教你建站之后做SEO千万不能这样执行。

      建站之后做SEO千万不能这样执行。当你的网站上线之后,你的网站好不容易优化到一定的程度,百度终于慢慢的给你一点权重,一点关键词排名和一点信赖,结果你就去大改小改,东改西改,那么很可能这点对于你的网站…

    2022年12月6日
    01
  • 百度绿萝算法针对网站哪些问题

    百度绿萝算法是百度为了解决搜索引擎反作弊等问题而产生的一种算法,那么百度绿萝算法原理是什么?百度绿萝算法针对网站哪些问题呢?下面就让我们一起去看看吧。 百度绿萝算法 百度绿萝算法原理 1、链接title与所指向…

    2022年5月21日
    0296

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息