衡量代码的好坏,包括两个非常重要的指标:
- 运行时间
- 占用空间
由于运行环境和输入规模的影响,代码的绝对执行时间是无法估计的,但是我们却可以预估代码的基本执行次数。我可以通俗的理解为:通过执行次数可以大概推算这个时间复杂度。
示例:
一个有序排列好的数组
1
int[] arry = {-5,-1,0,5,9,11,13,15,22,35,46},输入一个x,int x = 31
在数组中找出和为
x
的两个数,例如: 9 +22 = 31。要求时间复杂度为O(n)
.
好,当我们看到这个问题的时候,我们认为这很容易嘛(先不考虑时间复杂度),于是写了如下代码:
第一种写法:
1 |
|
根据我们上面对时间复杂度的了解,我们知道改算法的时间复杂度是 O(n^2)
, 是最低的一种,可以说,那么我们如何把时间复杂度设置为O(n)
,线性复杂度,其实就是需要一遍for
循环;
第二种算法:
1 | int[] array = {-5,-1,0,5,9,11,13,15,22,35,46}; |
这是一种典型以空间换时间的解法。
总结
常见的时间复杂度有如下:
- T(n) = O(n)
- T(n) = O(logn)
- T(n) = O(1)
- T(n) = O(n²)
这四种时间复杂度谁用时更长,更节省时间呢?
O(1) < O(logn) < O(n) < O(n²)