一:时间复杂度
1、时间复杂度的概念
时间复杂度是用来表示某一特定算法的所需时间的一种方法,它所代表的是算法中需要进行的基本计算的步骤的多少,但为什么要搞的那么复杂?为什么不直接使用时间来度量呢?
如果我们直接使用时间来度量算法之间的快慢,会发现相同的算法在不同的硬件环境下,所使用的时间并不相同,正如人力计算和机器计算的区别,拿一个深度学习的算法让人力进行计算,很可能需要几百年,几万年甚至更高,但一台超级计算机则可以在几天,甚至几分钟的时间内得到结果,这就是硬件环境带来的差异,但实际上计算量是相同的。
于是就提出了时间复杂度的概念,直接将算法中的基本运算的多少进行统计,用以表示一个算法的复杂程度。
所谓基本运算,比如加法,就是一个基本运算,对应的还有减法,乘法,除法,判断等。
2、常见时间复杂度
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
3、主定理
主定理公式:T(n)= aT(n / b)+ f (n)
a:递归调用所产生的子问题个数
b:子问题的规模
f(n):调用前的操作以及调用后把子问题的解组合成原问题的解的总工作量
二:空间复杂度
空间复杂度指数据存储所用存储空间的多少,与时间复杂度对应。在互联网时代,我们更关注时间复杂度,而非空间复杂度,因为存储不足的问题可以很容易得到解决,通过购买更多的硬件即可。
但是时间复杂度是与算法息息相关的,并且对于一个应用来说,快速的反应和计算是基本的需求,比如对于游戏来说,我们希望游戏中我们丢出去的攻击能够即时反馈到屏幕上,如果计算这一效果的算法时间复杂度太高,那么我们看到的就不会是流畅的画面。
公司希望推荐系统可以根据用户的行为快速更新,那推荐算法就不能有太高的时间复杂度,不然新的结果进行更新的时候用户的行为已经改变,而用户得到的推荐就不是他真正喜欢的内容了。
通常,我们可以使用较高的空间复杂度来换取较低的时间复杂度,举个简单的例子:
计算闰年,如果每一次都对输入的年份进行计算,那么时间复杂度会比较大。
但是换一个思路,我们也可以事先计算好并储存1-10000年,并标好哪一年是闰年,这样输入一个年份,就可以直接查表得到结论。