算法复杂度分为时间复杂度
,空间复杂度
时间复杂度:指执行当前算法所消耗的时间
空间复杂度:指执行当前算法所需要占用的内存空间
时间复杂度
1 2 3 4 5
| int i = 0,n=1000 i++ for (int i = 0; i < n; i++) { i++ }
|
我们假设一行代码执行时长为1,那么总时长为2+n,这个算法的耗时随着n的增加而增加,用时间复杂度表示为:O(n)
常见的时间复杂度量级有:
- 常数阶O(1)
- 对数阶O(logN)
- 线性阶O(n)
- 线性阶对数O(nlogN)
- 平方阶O(n²)
- 立方阶O(n³)
- n次方阶O(nⁿ)
- 指数阶O(2^n)
常数阶O(1)
无循环的代码,执行一次就完了
1 2 3
| int i = 0; i++; print(i);
|
对数阶O(logN)
执行时长成对数上涨
1 2 3 4
| int i = 1; while(i<n){ i = i*2; }
|
线性阶O(n)
执行一下循环
1 2 3 4
| int j = 1; for(int i=1;i<=n;i++){ j+=i; }
|
线性对数阶O(nlogN)
简单的线性+对数叠加
1 2 3 4 5 6
| int j = 1; for(int i=1;i<=n;i++){ while(j<n){ j = j*2; } }
|
平方阶O(n²)
两层循环
1 2 3 4 5 6
| int m = 0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ m += i+j; } }
|
立方阶O(n³)
3层循环
m次方阶O(nⁿ)
n层循环
指数阶O(2^n)
递归函数执行时长
1 2 3 4 5 6 7
| long aFunc(int n) { if (n <= 1) { return 1; } else { return aFunc(n - 1) + aFunc(n - 2); } }
|
空间复杂度
空间复杂度算法包括:
- 程序本身所占的空间
- 输入数据所占的空间
- 辅助变量所占的空间
常数阶O(1)
与变量无关,具体固定的空间占用
1 2 3
| for(int i = 1; i<=n ; i++){ i+=1; }
|
线性阶O(n)
分配的空间与变量n相关,随着n的变化而变化
1 2 3 4 5 6
| void fun(int n){ int a[] = new int[n] for(int i = 1; i<=n ; i++){ a[i]=i; } }
|