数据结构与算法(一):时间空间复杂度分析

378 阅读2分钟

what

复杂度分析是来衡量算法的执行效率和浪费空间,不需要具体测试数据的分析方法。

position

复杂度分析是算法学习的精髓,只要掌握了它,就掌握了一半数据结构和算法

why

##事后统计法

  1. 依赖测试环境
  2. 测试结果受测试数据影响很大

#大O复杂度表示法(渐进时间复杂度)

what

不表示真实的代码执行时间,表示代码执行时间随数据规模增大的变化趋势,所以也叫渐进时间复杂度。 所有代码的执行时间T(n)与每行代码的执行次数n成正比。规律:

**T(n)=O(f(n))**执行时间T(n),数据规模n,每行代码执行总次数f(n)。

how

  1. 当n特别大时,低阶、常量、系数,并不左右增长趋势,所以可以省去。所以在分析渐进时间复杂度的时候,只分析循环执行次数最多的那一段代码就可以了。
  2. 加法法则: 总的时间复杂度就等于量级最大的那块代码的时间复杂度
  3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

复杂度量级

按照数量级递增:常量级O(1)对数级O(logn)线性级O(n)线性对数级O(nlogn)平方级O(n2)K次方级O(nK)指数级O(2n)阶乘级O(n!)

注意:指数级和阶乘级为非多项式量级,效率非常低。其他的都是多项式量级

多项式量级

O(1)

只要没有循环和递归语句,即使有成千上万行代码也只是O(1).

O(logn),O(nlogn)

 i=1;
 while (i <= n)  {
   i = i * 2;
 }

其实相当于一个等比数列,2的x次方=n,两边同时取对数,得到x=log2n

同时在这里,对数的底数是可以提取的,只是一个常量,所以都写为O(logn)。根据乘法法则,刚才的代码如果执行了n遍,那么复杂度就是O(nlogn)比如,归并排序、快速排序的时间复杂度都是O(nlogn)。

O(m+n)、O(m*n)

当一段代码涉及m,n两个数据规模,我们无法预估那个数据规模更大,不能利用简单的加法法则,但是乘法法则依然可以用

空间复杂度

表示算法的存储空间与数据规模之间的增长关系。 我们常见的空间复杂度就是 O(1)、O(n)、O(n2 )

总结

复杂度分析并不难,关键在于多练。在以后遇到问题的时候,要多用多练,就比较容易掌握。