算法的时间复杂度与空间复杂度
常见的时间复杂度量级有:
- 常数阶O(1)
- 对数阶O(logN)
- 线性阶O(n)
- 线性对数阶O(nlogN)
- 平方阶O(n²)
- 立方阶O(n³)
- K次方阶O(n^k)
- 指数阶(2^n)
上面从上至下依次的时间复杂度越来越大,执行的效率越来越低。
1.常数阶O(1)
int i = 1; int j = 2; ++i; j++; int m = i + j;
消耗的时候并不随着某个变量的增长而增长
2.线性阶O(n)
for(i=1; i<=n; ++i) { j = i; j++; }
消耗的时间是随着n的变化而变化的
3.对数阶O(logN)
int i = 1; while(i<n) { i = i * 2; }
2 的 x 次方等于 n,那么 x = log2^n
4.线性对数阶O(nlogN)
for(m=1; m<n; m++) { i = 1; while(i<n) { i = i * 2; } }
5.平方阶O(n²)
for(x=1; i<=n; x++) { for(i=1; i<=n; i++) { j = i; j++; } }
空间复杂度比较常用的有:O(1)、O(n)、O(n²)
1.空间复杂度 O(1)
int i = 1; int j = 2; ++i; j++; int m = i + j;
代码中的 i、j、m 所分配的空间都不随着处理数据量变化
2.空间复杂度 O(n)
int[] m = new int[n] for(i=1; i<=n; ++i) { j = i; j++; }
第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间