大数据与算法系列之算法性能分析

我们在敲出自己心爱的程序的时候,我们是否想过,自己程序的性能咋样!

今天,我们说一说对程序或者算法的性能分析!

算法复杂度

算法复杂度是算法性能最基本的评价标准,复杂度是一个算法的时间运行函数,常用大写的‘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?


猜你喜欢

转载自blog.csdn.net/qq_36421826/article/details/80564277
今日推荐