时间复杂度和空间复杂度表示了一个算法的好坏情况。
一般来说在写题的时候允许的时间是1-2s,Java可能会稍长一些
而空间复杂度基本上不会在写题的时候给我们造成障碍。
不过空间复杂度可能更常见于算法优化的情况下。
总的来说,为了完成一个问题的消耗几乎是差不多的,也就是说,一般情况下,时间和空间是不可兼得的,我们能做的也就无非是牺牲时间换空间,牺牲空间换时间这两种罢了。
那么首先我们来看一下时间复杂度的计算方式,常见的量级有以下几种(由小到大):
- 常数阶O(1):执行的次数是有限的,可以数的,没有循环等复杂结构,和我们输入数据的规模无关的
- 对数阶O(logN):是二分的时间复杂度,可以理解成不到一次循环,按2,4,8。。。。这样的方式循环
常见例子如下:
int i = 1;
while(i<n)
{
i = i * 2;
}
从上面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2^n
1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +…1/n也等于logN
(我也推不明白,记住了就完事了ahhhh)
- 线性阶O(n):一次循环
- 线性对数阶O(nlogN):可以理解成将对数的那种循环n次,
- 平方阶O(n^2):双重循环
- 立方阶O(n^3):三重循环
- K次方阶O(n^k):k次循环
- 指数阶(2^n):一般是树结构的,n为数的层数,01枚举,二叉树,叶子节点的个数
下面是y总的时间复杂度和数据范围的量级的写题时的对应关系:
目前先记着:
1E5要求n(logN)就行,
特别小的数乱写就行,
特别大的数就想O(N)的算法
还有 平均时间复杂度、最坏时间复杂度、最好时间复杂度 ,我们放在讲排序的时候讲。
空间复杂度就好说很多了,比较常用的有:O(1)、O(n)、O(n²)。
就是常数,一维数组,二维数组这种罢了,很好想。