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

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

相关推荐

  • 创业在宿迁 王道强:从打工仔到返乡创业能人

      太平镇满意电子材料有限公司总经理王道强表示,下一步我们打算进一步扩大生产规模,把我们企业做强做大,为地方经济发展做出我们应该做的贡献。   正在检查车间机器运营情况的就是王道强。今年36岁的他是地地道道的泗洪县太平镇人。2004年,王道强来到上海,开始了他的打工之路。工作虽然辛苦,但王道强在电子企业打工期间,好学上进,专心学习生产的每一道工序。   原标…

    创业分享 2023-05-29
    50
  • 广东省教育厅调研组来广东工商职业学院调研就业创业工作

    中国高校之窗 [1] [2] 广东工商职业学院院长王元良、副院长丁孝鹏、学院办公室主任韩治国、创新创业教育中心主任兼东方亮电子商务有限公司副总经理李英杰、创新创业教育中心副主任兼创业发展研究院常务副院长邱立军、就业指导中心副主任龙辉驰、工商管理系副主任兼创业发展研究院副院长邓振华、教务处副处长荀海鹏、就业创业教研室主任费水蓉等参与座谈。   丁孝鹏…

    创业分享 2023-05-22
    70
  • Miss Zhang携手闪银重磅打造“全民创业”

      据微商新媒体发布的《2016-2017微商发展与趋势报告》指出,2015年微商总体市场规模达到1819.5亿元,2016年已达到5000亿元,同比增长174.8%,2015年全国微商从业规模为1257万人,2016年已经超过2000万人,同比增长59.1%。经历了前期的野蛮生长,微商目前已日趋规范化。2017年2月16日国家工商总局就首次对微商作出了正面…

    创业分享 2023-05-25
    76
  • 家庭幸福增助力 “小妹”创业上坦途

      她自幼因病双目失明,在家人帮助下到盲人中专学校学习中医推拿。1988年,23岁的她毅然辞职创办巢湖市第一家盲人按摩推拿诊所,从此走上了创业、授课、育人之路。她说:“我虽然看不见,但心里亮堂,希望竭尽所能,为社会贡献力量,传递正能量。”她叫洪小妹,是安徽省残疾人“自强模范”、首届巢湖市残疾人“创业之星”称号获得者。  &nbs…

    创业分享 2023-05-18
    34
  • 培育创新创业青春力量 打造新旧动能转换高地

    当前位置:首页 >> 产融看点 2018.06.08 星期五 培育创新创业青春力量 打造新旧动能转换高地      在“大众创业、万众创新”的热潮中,高校正扮演着“领路人”的角色,通过创新创业教育,培育了一大批“双创”生力军。   6月2日,经教育部高等教育司批准,中国高校创新创业学院联盟在山东大学中心校区成立。截至目前,该联盟共吸引全…

    创业分享 2023-05-17
    67

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信