Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
aa:lab:sol:5 [2023/11/13 13:46] 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 posibile: g(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 n 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>=0 etc. | + | |
| - | </note> | + | |
| - | 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: | + | **Răspuns:** |
| + | Probabilitatea depășește 0.5 în jurul lui n = 23. | ||
| + | Acest rezultat este contraintuitiv — chiar și î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^3. g(n)∈Ω(f(n))=> ∃c>0, ∃n_0∈N, astfel incat ∀ n≥n_0, c·g(n)≤ f(n) | + | * n = 23$ → P(\text{coliziune}) \approx 0.507$ |
| - | => 0,001·n^3≤20√n, adevarat pentru c=0.001/20 si n_0=1. | + | * n = 30$ → P(\text{coliziune}) \approx 0.706$ |
| - | </note> | + | |
| - | $ 10·n∈θ(n)$ | + | **Legătură cu hashing:** |
| - | <note> | + | Fiecare zi ≈ un slot hash, iar fiecare persoană ≈ un element inserat. |
| - | 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) | + | La fel ca în hashing, chiar și cu multe sloturi disponibile, coliziunile devin probabile după doar sqrt(k) inserări (ordine (O(sqrt(k))). |
| - | => c_1·n≤ 10n ≤c_2 n, adevarat pentru c_1=8, c_2=10 si n_0=1. | + | |
| - | </note> | + | ---- |
| - | $ n∈θ(10n)$ | + | |
| - | <note> | + | **Întrebare 2:** |
| - | 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) | + | Cum se aseamănă acest fenomen cu coliziunile într-o tabelă hash? |
| - | => c_1·10·n≤ n ≤c_2·10·n, adevarat pentru c_1=1/10, c_2=1 si n_0=1. | + | |
| - | </note> | + | **Răspuns:** |
| - | 4. Verificați valoarea de adevăr a următoarelor propoziții: | + | În ambele cazuri, avem o **alocare aleatoare** într-un spațiu finit de valori. |
| - | $ √n∈O(logn)$ | + | Coliziunile apar mult mai devreme decât ne-am aștepta, iar acest lucru afectează eficiența căutărilor. |
| - | <note> | + | |
| - | f(n)=logn, g(n)=√n. Cum f si g sunt functiile f si g sunt monotone si cresctoare, verific afirmatia utilizand limite. | + | **Explicație scurtă:** |
| - | lim(n→∞)(g(n)/f(n))=lim(n→∞)(√n/log(n))=(l'Hospital)lim(n→∞)(n/2*√n)=1/2*lim(n→∞)(√n)=+∞ => **Fals** | + | Dacă spațiul are dimensiune k, atunci după doar sqrt(k) inserări, probabilitatea unei coliziuni devine semnificativă (≈50%). |
| - | </note> | + | 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. |
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Exemplul 2: Problema colecționarului de cupoane ==== | ||
| + | |||
| + | **Întrebare 1:** | ||
| + | Cum crește numărul așteptat de extrageri odată cu n? | ||
| + | |||
| + | **Răspuns:** | ||
| + | Numărul mediu de extrageri crește aproximativ proporțional cu n(ln n). | ||
| + | |||
| + | **Explicație:** | ||
| + | |||
| + | $$ | ||
| + | E[T] = n H_n = n (1 + \tfrac{1}{2} + \tfrac{1}{3} + \dots + \tfrac{1}{n}) \approx n (\ln n + \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. | ||
| + | |||
| + | ---- | ||