算法复杂度分析(1)


复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。

数学基础

如果存在常数c和n0使得当N>=n0时T(N)<=cf(N),则记为T(N)=O(f(N))。

例如:虽然对于较小的N值1000N要比N2大,但N2以更快地速度增长,因此N2最终将是更大的函数。在这种情况下,N=1000是转折点。
如上面定义所说,最后总会存在某个点n0从它以后cf(N)总是至少与T(N)一样大,从而若忽略常数因子,则f(N)至少与T(N)一样大。
在例子中,T(N)=1000N,f(N)=N2,n0=1000而c=1。我们也可以让n0=10而c=100。
因此可以说,1000N=O(N2)。这种记法称为大O标记法

大O复杂度表示法

通过分析代码,总结了一个规律,所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比。
把这个规律总结成一个公式。

T(n)=O(f(n))

其中,T(n) 我们已经讲过了,它表示代码执行的时间;n 表示数据规模的大小;f(n) 表示每行代码执行的次数总和。因为这是一个公式,所以用 f(n) 来表示。公式中的 O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比。
大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度
当 n 很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略。我们只需要记录一个最大量级就可以了。

时间复杂度分析

  1. 只关注循环执行次数最多的一段代码
  2. 加法法则:总复杂度等于量级最大的那段代码的复杂度
    T1(n)=O(f(n)),T2(n)=O(g(n))
    则T(n)=T1(n)+T2(n)= O(f(n) + g(n)) = max(O(f(n)), O(g(n)))
  3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
    T1(n)=O(f(n)),T2(n)=O(g(n))
    则T(n)=T1(n)*T2(n)=O(f(n)*g(n))

常见时间复杂度实例

多项式量级:
常数阶O(1)
对数阶O(logn)
线性阶O(n)
线性对数阶O(nlogn)
平方阶O(n2)
立方阶O(n3)
k次方阶O(nk)

非多项式量级只有两个:
O(2n) 和 O(n!)

空间复杂度

空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系

发布了79 篇原创文章 · 获赞 10 · 访问量 8665

猜你喜欢

转载自blog.csdn.net/weixin_44728363/article/details/103247331