第二章2.2アルゴリズム時間複雑度例題説明
#%% md
これはいかなるAIエンジニアが深く理解しなければならない概念である.各設計アルゴリズムについて,O(N),O(N^2):o notationをこの2つの側面から解析する必要がある.
#%% md
時間の複雑さ?空間の複雑さ?O(N)2単位のメモリ容量=O(1)#constant space complexity
時間複雑度:O(N^2);空間複雑度:O(1)
アルゴリズムXの効率がYより高いと言うたびに?時間複雑度X:o(log n)>Y:o(n)o(n log n)>Y:o(n^2)
X実际の効率(秒来)>Y実际の効率(秒)は必ずしも!!!n十分大きい
#%%
定理:if xの時間複雑度はyの時間複雑度より優れているが,n>Mの場合,Xの実際の効率がYの実際の効率よりも優れていることを保証できる十分な数Mが存在すると仮定する.
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を探す
時間の複雑さと空間の複雑さ
これはいかなるAIエンジニアが深く理解しなければならない概念である.各設計アルゴリズムについて,O(N),O(N^2):o notationをこの2つの側面から解析する必要がある.
#%%
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の時間複雑度より優れているが,n>Mの場合,Xの実際の効率がYの実際の効率よりも優れていることを保証できる十分な数Mが存在すると仮定する.
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を探す