第二章 2.2 算法时间复杂度例题讲解

#%% md

时间复杂度和空间复杂度

这是任何AI工程师必须要深入理解的概念。对于每一个设计出来的算法都需要从这两个方面来分析
O(N), O(N^2) : o notation

#%%

int a = 0, b = 0; 

for (i = 0; i < N; i++) { #  O(N)+O(N)=2*O(N)=O(N)
    a = a + rand();# N*1个操作 = O(N)
    b = b + rand();# N*1个操作 = O(N)
} 
for (j = 0; j < N/2; j++) { 
    b = b + rand(); # N/2 *1个操作 = 1/2*O(N)=O(N)
} 

#%% md

时间复杂度? 空间复杂度?
O(N)
2个单位的内存空间 = O(1) # constant space complexity

#%%

int a = 0; i,j
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
    
total = 1+2+3,...+N = N*(N+1)/2 = N*N/2 + N/2 
= 1/2*O(N^2) + 1/2*O(N) = O(N^2) + O(N) = O(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(n*log n)

#%%



#%%

int a = 0, i = N; 
while (i > 0) { 
    a += i;  # 1个操作
    i /= 2;   #1个操作
} 

N = 40;  i=40

i=20  2
i=10  2
i=5   2
i=2   2
i=1   2
i=0   2
terminate
2*log(N) = 2* O(log N) = O(log N)
 


#%%



#%% md

我们每当说算法X的效率要高于Y时指的是? 时间复杂度
X: o(log n) > Y: o(n)
o(n log n) > Y: o(n^2)

X实际的效率(秒来) > Y实际的效率(秒) 不一定!!!
n足够大

#%%

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

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

O(1) O(log n) o(n) o(nlog n): quicksort, heapsort, mergesort o(n^2) o(n^3)… o(2^n) o(3^n)
o(log n): 寻找一个element (从tree,heap), binary search

发布了31 篇原创文章 · 获赞 3 · 访问量 878

猜你喜欢

转载自blog.csdn.net/qq_38888209/article/details/104411672