====Soluții Notații asimptotice==== Cheetsheet: constanta << logaritmica << polinomiala << exponentiala << factoriala 1. Dați exemple de câte o funcție din următoarele clase de complexitate: $ O(n)$ Trebuie sa gasim functii care cresc maxim la fel de repede ca f(n)=n. Exemple soluții posibile: g(n)=n+6, g(n)=8n+7 (aceeasi crestere), g(n)=log(n) (crestere mai mica) $Ω(log(n))$ Trebuie sa gasim functii care cresc mai repede sau la fel de repede ca f(n)=n^2. Exemple soluții posibile: g(n)=100*log(n)+5, (aceeasi crestere), g(n)=n^3, g(n)=nlog(n) (mai repede) $θ(n^2)$ Trebuie sa gasim functii care cresc la fel de repede ca f(n)=log(n). Exemple soluții posibile: g(n)=a*n^2+b*n+c*log(n)+d, a>0 (aceeasi crestere ca n^2, fiind dominant in functie) $ɷ(1/n)$ Trebuie sa gasim functii care cresc strict mai repede decat f(n)=1/n. Cum 1/n este o functie descrescatoare, solutia este orice functie crescatoare. Exemple soluții posibile: g(n)=c, c = constanta, g(n)=n+23, g(n)=nlogn+n^4 etc. $ o(3^n)$ Trebuie sa gasim functii care cresc strict mai incet decat f(n)=3^n. Exemple soluții posibile: g(n)=n^p,p>=0 etc. 2. Pentru fiecare din perechile de mai jos, dați un exemplu concret de constante pentru care inegalitățile implicate în definiția clasei de complexitate sunt adevărate: $ log(n)∈o(√n)$ f(n)=√n, g(n)=log(n). g(n)∈o(f(n))=> ∀c>0, ∃n_0∈N, astfel incat ∀ n≥n_0, g(n)≤ c·f(n) => log(n)≤c·√n, adevarat pentru c=1 si n_0=100. $ 100·n^2∈O(2^n)$ f(n)=2^n, g(n)=100·n^2. g(n)∈O(f(n))=> ∃c>0, ∃n_0∈N, astfel incat ∀ n≥n_0, g(n)≤ c·f(n) => 100·n^2≤c·2^n, adevarat pentru c=100 si n_0=4. $ 0,001·n^3∈Ω(20√n)$ f(n)=20√n, g(n)=0,001·n^3. g(n)∈Ω(f(n))=> ∃c>0, ∃n_0∈N, astfel incat ∀ n≥n_0, c·g(n)≤ f(n) => 0,001·n^3≤20√n, adevarat pentru c=0.001/20 si n_0=1. $ 10·n∈θ(n)$ f(n)=n, g(n)=10·n. g(n)∈θ(f(n))=> ∃c_1, c_2>0, ∃n_0∈N, astfel incat ∀ n≥n_0, c_1·g(n)≤ f(n) ≤ c_2·g(n) => c_1·n≤ 10n ≤c_2 n, adevarat pentru c_1=8, c_2=10 si n_0=1. $ n∈θ(10n)$ f(n)=10·n, g(n)=n. g(n)∈θ(f(n))=> ∃c_1, c_2>0, ∃n_0∈N, astfel incat ∀ n≥n_0, c_1·g(n)≤ f(n) ≤ c_2·g(n) => c_1·10·n≤ n ≤c_2·10·n, adevarat pentru c_1=1/10, c_2=1 si n_0=1. 4. Verificați valoarea de adevăr a următoarelor propoziții: $ √n∈O(logn)$ f(n)=logn, g(n)=√n. Cum f si g sunt functiile f si g sunt monotone si cresctoare, verific afirmatia utilizand limite. lim(n→∞)⁡(g(n)/f(n))=lim(n→∞)⁡(√n/log(n))=(l'Hospital)lim(n→∞)⁡(n/2*√n)=1/2*lim(n→∞)⁡(√n)=+∞ => **Fals** $ logn∈O(log(log n))$ f(n)=log(logn), g(n)=logn. Cum f si g sunt functiile f si g sunt monotone si cresctoare, verific afirmatia utilizand limite. lim(n→∞)⁡(g(n)/f(n))=lim(n→∞)⁡(logn/log(log n))=(l'Hospital)lim(n→∞)⁡(1/n / 1/logn * 1/n)=1/2*lim(n→∞)⁡(logn)=+∞ => **Fals** $ n∈O(√n logn)$ f(n)=√n logn, g(n)=n. Cum f si g sunt functiile f si g sunt monotone si cresctoare, verific afirmatia utilizand limite. lim(n→∞)⁡(g(n)/f(n))=lim(n→∞)⁡(n/√n logn)=lim(n→∞)⁡(√n/logn)=(l'Hospital)lim(n→∞)⁡(1/2 * 1/n^2 / 1/n)=1/2*lim(n→∞)⁡(1/n)=0 => **Fals** $ n+logn∈θ(n)$ f(n)=n, g(n)=n + logn. Cum f si g sunt functiile f si g sunt monotone si cresctoare, verific afirmatia utilizand limite. lim(n→∞)⁡(g(n)/f(n))=lim(n→∞)⁡(n + logn/n)=1 + lim(n→∞)⁡(logn/n)=(l'Hospital)1 + lim(n→∞)⁡(1/n)= 1 => **Adevarat** $ log(nlogn)∈θ(logn)$ f(n)=logn, g(n)=log(nlogn). Cum f si g sunt functiile f si g sunt monotone si cresctoare, verific afirmatia utilizand limite. lim(n→∞)⁡(g(n)/f(n))==(l'Hospital)lim(n→∞)⁡(1/nlogn*(logn+1) / 1/n)=lim(n→∞)⁡(1/logn*(logn+1)) =lim(n→∞)⁡(1 + 1/logn)=1 => **Adevarat** $ √n∈ɷ(log n)$ f(n)=logn, g(n)= √n. Cum f si g sunt functiile f si g sunt monotone si cresctoare, verific afirmatia utilizand limite. lim(n→∞)⁡(g(n)/f(n))=lim(n→∞)⁡(√n/logn)= (l'Hospital)lim(n→∞)⁡(1/2*√n)= ∞ => **Adevarat** 5. Aduceți următoarele la o formă simplă (o clasă de complexitate ce depinde de o anume funcție): * $ \frac{O(n\sqrt{n})}{\Theta(n)} = \ldots$ Fie f(n)∈O(n/√n) si g(n)∈θ(n). f(n)∈O(n/√n) => * $ \frac{\Theta(n)}{O(\log(n))} = \ldots$