#%% 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