时间复杂度与空间复杂度的计算

区分算法好坏的标准:
时效(算法的执行时间)和存储(算法执行需要的存储空间)

时间复杂度

大 O 表示法:

当规模增加时,增长最快起主导性作用的函数 O(f(n))

比如有一个算法的 T(n) = 2n^2+ 2n + 1000,当 n 为 10 或者 20 的时候,常数 1000 看起来对 T(n) 起着决定性的作用。但是当 n 为 1000 或者 10000 或者更大呢?n^2 起到了主要的作用。实际上,当 n 非常大时,后面两项对于最终的结果来说已经是无足轻重了。与上面求和函数的例子很相似,当 n 越来越大的时候,我们就可以忽略其它项,只关注用 2n^2 来代表 T(n) 的近似值。同样的是,系数 2 的作用也会随着 n 的增大,作用变得越来越小,从而也可以忽略。我们这时候就会说 T(n) 的数量级 f(n) = n^2,即 O(n^2)。

最好情况、最坏情况和平均情况

有时候算法的运行时间还取决于具体数据而不仅仅是问题的规模大小

一般我们所算的时间复杂度是最坏情况下的时间复杂度,因为,它提供了一种保证,这个保证运行时间将不会再坏了

时间复杂度与空间复杂度的计算

时间复杂度与空间复杂度的计算

O(1):与数据的规模大小 n 无关,执行时间恒定的算法我们就叫它具有 O(1) 的时间复杂度.

计算时间复杂度时,以最大的主导为准,并且可以省略系数。

空间复杂度

一般情况下,我们的程序在机器上运行时,刨去需要存储程序本身的输入数据等之外,还需要存储对数据操作的「存储单元」。如果输入数据所占空间和算法无关,只取决于问题本身,那么只需要分析算法在实现过程中所占的「辅助单元」即可。如果所需的辅助单元是个常数,那么空间复杂度就是 O(1)。

因为当今硬件的存储量级比较大,一般不会为了稍微减少一点儿空间复杂度而大动干戈,更多的是去想怎么优化算法的时间复杂度。所以我们在日常写代码的时候就衍生出了用「空间换时间」的做法,并且成为常态。

参考链接