Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
aa:lab:sol:5 [2023/11/13 14:08]
maria.tudosie
aa:lab:sol:5 [2025/11/01 11:55] (current)
codrut_eduard.bicu
Line 1: Line 1:
-====Soluții ​Notații asimptotice==== +===== Soluții ​Laborator 5: Analiza probabilistă în Hashing =====
-<​note>​ +
-Cheetsheet: constanta << logaritmica << polinomiala << exponentiala << factoriala +
-</​note>​+
  
-1. Dați exemple de câte o funcție din următoarele clase de complexitate:​+Această pagină conține explicații și răspunsuri pentru întrebările din laboratorul 5.
  
-$ O(n)$ +----
-<​note>​ +
-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) +
-</​note>​ +
-$Ω(log(n))$ +
-<​note>​ +
-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) +
-</​note>​ +
-$θ(n^2)$ +
-<​note>​ +
-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) +
-</​note>​+
  
-$ɷ(1/n)$ +==== Exemplul ​1: Paradoxul zilelor de naștere ​====
-<​note>​ +
-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 posibileg(n)=c, c constanta, g(n)=n+23, g(n)=nlogn+n^4 etc. +
-</​note>​+
  
-$ o(3^n)$ +**Întrebare 1:​**  ​ 
-<​note>​ +Pentru ce valoare a lui probabilitatea ca două persoane să aibă aceeași zi de naștere depășește ​0.5?
-Trebuie sa gasim functii care cresc strict mai incet decat f(n)=3^n. +
-Exemple soluții posibile: g(n)=n^p,​p>​= etc. +
-</​note>​+
  
-2Pentru 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:+**Răspuns:​** ​  
 +Probabilitatea depășește 0.5 în jurul lui n = 23.   
 +Acest rezultat este contraintuitiv — chiar șîntr-un grup mic, șansele ​de coliziune ​sunt mari.
  
-$ log(n)∈o(√n)$ +**Explicație:​**  ​ 
-<​note>​ +Probabilitatea ca toate zilele să fie distincte este:
-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. +
-</​note>​+
  
-100·n^2∈O(2^n)+$$ 
-<​note>​ +P(\text{distincte}) = \frac{k!}{(k-n)! k^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. +
-</​note>​+
  
-0,001·n^3∈Ω(20√n)$ +Pentru $k = 365$, dacă evaluăm numeric: 
-<​note>​ +  ​* ​n = 20$ → P(\text{coliziune}\approx ​0.41$ 
-f(n)=20√n, g(n)=0,001·n^3g(n)∈Ω(f(n))=> ∃c>0, ∃n_0∈N, astfel incat ∀ n≥n_0, c·g(n)≤ f(n)  +  * = 23$ → P(\text{coliziune}\approx ​0.507$ 
-=> 0,​001·n^3≤20√n,​ adevarat pentru c=0.001/20 si n_0=1. +  * = 30$ → P(\text{coliziune}\approx ​0.706$
-</​note>​+
  
-$ 10·n∈θ(n)$ +**Legătură cu hashing:​**  ​ 
-<​note>​ +Fiecare zi ≈ un slot hashiar fiecare persoană ≈ un element inserat  
-f(n)=ng(n)=10·ng(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) +La fel ca în hashingchiar și cu multe sloturi disponibilecoliziunile devin probabile după doar sqrt(kinserări ​(ordine ​(O(sqrt(k))).
-=> c_1·n≤ 10n ≤c_2 nadevarat pentru c_1=8c_2=10 si n_0=1. +
-</​note>​ +
-$ n∈θ(10n)+
-<​note>​ +
-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. +
-</​note>​ +
-4. Verificați valoarea de adevăr a următoarelor propoziții:​+
  
-$ √n∈O(logn)$ +----
-<​note>​ +
-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** +**Întrebare ​2:**   
-</​note>​+Cum se aseamănă acest fenomen cu coliziunile într-o tabelă hash?
  
-$ logn∈O(log(log n))$ +**Răspuns:​**  ​ 
-<​note>​ +În ambele cazuriavem o **alocare aleatoare** într-un spațiu finit de valori  
-f(n)=log(logn)g(n)=lognCum f si g sunt functiile f si g sunt monotone si cresctoareverific afirmatia utilizand limite.+Coliziunile apar mult mai devreme decât ne-am așteptaiar acest lucru afectează eficiența căutărilor.
  
-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** +**Explicație scurtă:​** ​  
-</​note>​+Dacă spațiul are dimensiune k, atunci după doar sqrt(kinserări, probabilitatea unei coliziuni devine semnificativă ​(≈50%).  ​ 
 +Asta înseamnă că pentru o tabelă hash cu 10^6 sloturi, e foarte probabil să apară coliziuni deja după câteva mii de inserări.
  
-$ n∈O(√n logn)$ +----
-<​note>​ +
-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)==> **Fals** +==== Exemplul ​2: Problema colecționarului de cupoane ====
-</​note>​+
  
-$ n+logn∈θ(n)$ +**Întrebare 1:​**  ​ 
-<​note>​ +Cum crește numărul așteptat de extrageri odată cu 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/​logn)=1 + lim(n→∞)⁡(n/​logn)=(l'​Hospital)1 + lim(n→∞)⁡(n)= ∞ => **Fals** +**Răspuns:**   
-</​note>​+Numărul mediu de extrageri crește aproximativ proporțional cu n(ln n).
  
-$ log(nlogn)∈θ(logn)$ +**Explicație:​**
-<​note>​ +
-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)= ∞ =**Fals** +$$ 
-</​note>​+E[T] = H_n = n (1 + \tfrac{1}{2} + \tfrac{1}{3} + \dots + \tfrac{1}{n}\approx n (\ln + \gamma) 
 +$$ 
 + 
 +unde $\gamma \approx 0.577$ este constanta lui Euler–Mascheroni. 
 +De exemplu: 
 + 
 +| n  | E[T] teoretic | E[T] simulat | 
 +|----|---------------|--------------| 
 +| 10 | 29.3          | ≈ 29         | 
 +| 50 | 224.5         | ≈ 225        | 
 +| 100| 518.7         | ≈ 520        | 
 + 
 +Astfel, timpul așteptat crește mai repede decât liniar, dar mult mai lent decât pătratic. 
 + 
 +---- 
 + 
 +**Întrebare 2:**   
 +Ce analogie există între această problemă și procesul de „umplere” a unei tabele hash? 
 + 
 +**Răspuns:​** ​  
 +Problema colecționarului de cupoane este echivalentă cu procesul de inserare în hash până când **toate sloturile sunt ocupate**. ​  
 +Fiecare „cupon” reprezintă un slot distinct, iar fiecare extragere corespunde unei inserări. 
 + 
 +**Explicație:​** ​  
 +La început, găsim ușor sloturi libere ​(șanse mari de succes)  
 +Pe măsură ce tabela se umple, șansele de a găsi un slot nou scad — apar tot mai multe „coliziuni”. ​  
 +În medie, este nevoie de aproximativ n(ln n) inserări pentru a umple toate sloturile. 
 + 
 +---- 
 + 
 +==== Concluzie generală ==== 
 + 
 +  ​* **Coliziunile** apar mai devreme decât ne-am aștepta ≈ sqrt(k) inserări). ​  
 +  * **Umplerea completă** a unei tabele hash necesită în jur de n ln n inserări. ​  
 +  * Aceste două fenomene definesc limitele probabilistice ale hashing-ului eficient. 
 + 
 +----