我们在敲出自己心爱的程序的时候,我们是否想过,自己程序的性能咋样!
今天,我们说一说对程序或者算法的性能分析!
算法复杂度
算法复杂度是算法性能最基本的评价标准,复杂度是一个算法的时间运行函数,常用大写的‘O’表示,算法复杂度都时间复杂度和空间复杂度组成
1.时间复杂度
时间复杂度描述了算法的运行时间,例如,一个算法对于输入规模n的计算,它平均需要计算6n^3+9n次才能得到问题的解,则他的时间复杂度可视为O(n^3)
常见的时间复杂度大约有6种,他们的含义如下。
1.O(1):表示在常数级别完成问题的解,如在代码程序的位置互换
int i =10; int j = 20;
int temp = i;
i = j;
j = temp;
2.O(lgn):一般采用分治思想的算法
int n=...
if(x>0){
x=x/n
}
3.O(n):可以理解为,将问题进行了常数次迭代
for (int i = 0; i < n; i++){
system.out.println(i)
}
4.O(nlog(n)):在数据遍历的过程中又使用了分治的思想
请参照快速排序的实现
5.O(n^2):对问题进行了两层嵌套遍历
int[] a = {3, 2, 4, 7, ..., n}
for(int i = 0; i < n - 1; i++){
for (int j = i + 1; j < n; j++){
if(a[i] > a[j]){ // do swap, f(n)= n * n
int temp = a[i]; //频度最大
a[i] = a[j];
a[j] = temp;
}
}
}
6.O(n^3):对问题进行了三层嵌套遍历
for i..n
for ...
for ...
do something...
7.O(2^n):指数型
T(n)=2T(n-1) T(1)=1;求T(n)
除了这些之外,还有O(n^n)、O(n!)等等
2.空间复杂度
空间复杂度的描述的是空间
1.O(1):表示在常数级别完成问题的解,如在代码程序的位置互换
int i =10; int j = 20;
int temp = i;
i = j;
j = temp;
空间占用情况为一个变量,所以,空间复杂度是O(1),时间复杂度O(1)
int a =0;
for(i = 0;i<n;i++){
a=i;
}
空间占用情况为一个变量,所以,空间复杂度是O(1),但是时间复杂度是O(n)
2.O(n):表示在常数级别完成问题的解
List<String> list = new ArrayList<String>();
for(i = 0;i<n;i++){
list[i]=i;
}
list中开辟了n个空间,所以空间复杂度是O(n),时间复杂度也是O(n)
.......其他情况以此类推
最后,来两道从网上找的关于复杂度的面试题
【腾讯】下面算法的时间复杂度是____
int foo(int n) {
if (n <= 1) {
return 1;
}
return n * foo(n - 1);
}
【京东】以下函数的时间复杂度为____
void recursive(int n, int m, int o) {
if (n <= 0) {
printf("%d, %d ", m, o);
} else {
recursive(n - 1, m + 1, o);
recursive(n - 1, m, o + 1);
}
}
不对的地方,敬请指正,下方留言。
can u get it out?