算法复杂度介绍

对于每一个设计出来的算法都需要从两个方面来分析:时间复杂度和空间复杂度

计算如下算法的时间复杂度和空间复杂度

题目一

int a = 0, b =0;

for (i = 0; i < n; i ++){

        a = a + round();

}

for(j =0; j < n/2; j++){

        b = b + round();

}

时间复杂度 O(N) 

空间复杂度 O(1)

赋值了两个常数a和b,分配了两个单位的内存空间,与N无关,所以空间复杂度为O(1) constant space complexity(常数空间复杂度)

题目二

int a = 0;

for (i =0; i< N; i ++){

        for (j =N; j>i; j++){

                a = a + i + j;

        }

}

时间复杂度计算如下:

i = 0 j = N...1 需要N次操作

i = 1 j = N...2 需要N-1次操作

i = 2 j = N ...3 需要N-2次操作

i = N-1 j = N需要1次操作

(1+N)*N/2

时间复杂度 O(N^2) 

空间复杂度 O(1)

题目三

int i, j, k = 0;

for (i = n/2; i <=n; i ++) {

        for(j = 2; j<= n; j=j*2){

                k = k + n/2

        }

}

时间复杂度 O(NlogN) 

空间复杂度 O(1)

题目四

int a = 0, i =N;

while (i > 0){

        a += i;

        i/= 2;

}

时间复杂度 O(logN) 

空间复杂度 O(1)

我们每当说算法x的效率要高于算法y指的是?

答:指的是时间复杂度,例如x(logn) > y(n) ;x(nlogn)> y(n^2)

x实际的效率(秒)> y实际的效率(秒)不一定!!!

n足够大

定理:if x的时间复杂度要优于y的时间复杂度,那么,假设存在一个足够大的数M,当n>M时,我们可以保证x的实际效率大于y的实际效率

C*O(n)  = O(n) if only if C跟n没有相关性

O(logn) :从tree、heap中寻找一个element, binary search二分查找

O(nlogn): quicksort mergesort heapsort

猜你喜欢

转载自blog.csdn.net/u012130638/article/details/133467154