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:6 [2023/11/17 19:52] vlad.juja |
aa:lab:sol:6 [2025/11/11 12:10] (current) stefan.sterea |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Soluții Laboratorul 6 ====== | ====== Soluții Laboratorul 6 ====== | ||
| - | Există multiple soluții pentru fiecare problemă, mai mult sau mai puțin bune, care oferă răspuns corect pentru un set mai mare sau mai mic, dar limitat, de date de intrare. În continuare vom prezenta câteva posibile idei. \\ | + | 1. |
| - | \\ | + | a. binary_search: |
| + | După verificările realizate în timp constant, problema este împărțită în două subprobleme de dimensiune înjumătățită, din care doar una este aleasă. (Pentru simplitate, putem considera termenul constant = 1) \\ | ||
| + | $ T(n) = T(n/2) + 1, T(1) = 1 $ | ||
| - | === 1. K Vertex Cover === | + | **Metoda arborilor:** \\ |
| + | Fiecare nivel conține $ T\left(\frac n{2^h}\right) + 1 $ unde $ h $ este numărul nivelului (începând de la 0), având $ T(1) $ în frunze, deci $ \log n $ niveluri. De asemenea avem o singură frunză. Suma totală este: | ||
| + | $$ \left(\sum_{i=0}^{\log n - 1} 1\right) + T(1) = \log n + 1 = \Theta(\log n) $$ | ||
| - | Soluția greedy pentru problema K Vertex Cover ar fi să alegem în mod repetat un nod care acoperă cea mai mare număr de muchii neacoperite. În fiecare pas, adăugăm nodul respectiv în setul nostru și eliminăm toate muchiile care sunt acoperite de acest nod. Repetăm acest proces până când avem un set de K noduri sau până când toate muchiile sunt acoperite. \\ | + | **Metoda substituției:** \\ |
| + | Vrem sa demonstrăm că $ T(n) = \Theta(\log n) $, adică \\ | ||
| + | $ \exists(c_1, c_2 > 0)(N \geq 0): \forall(n\geq N): c_1 \log n \leq T(n) \leq c_2 \log n $ | ||
| - | {{:aa:lab:sol:k_vertex_cover_counter_ex.jpg?nolink&300|}} | + | Cazul de bază: \\ |
| + | $ N = 2 $ \\ | ||
| + | $ c_1 \log 2 = c_1 \leq T(2) = 1 + 1 = 2 \leq c_2 \log 2 = c_2 \Rightarrow $ \\ | ||
| + | $ c_1 \leq 2 $ \\ | ||
| + | $ c_2 \geq 2 $ | ||
| - | În exempul de față, algoritmul greedy nu poate depista Cover-ul de lungime 4 format din nodurile {$ 5, 6, 7, 8$} pentru că va alege ca prim nod nodul $ 9$. \\ | + | Pasul inducției: \\ |
| - | \\ | + | pp. că $ c_1 \log(n/2) \leq T(n/2) \leq c_2 \log(n/2) $ \\ |
| + | $ \Rightarrow c_1 \log(n/2) + 1 \leq T(n/2) + 1 \leq c_2 \log(n/2) + 1 $ \\ | ||
| + | $ \Rightarrow c_1 \log n - c_1 \log 2 + 1 \leq T(n) \leq c_2 \log n - c_2 \log 2 + 1 $ \\ | ||
| + | $ \Rightarrow c_1 \log n + (1 - c_1) \leq T(n) \leq c_2 \log n - (c_2 - 1) $ \\ | ||
| + | Dacă $ 1 - c_1 \geq 0 $ și $ c_2 - 1 \geq 0 $ atunci \\ | ||
| + | $ \Rightarrow c_1 \log n \leq T(n) \leq c_2 \log n $ \\ | ||
| + | Astfel, avem condițiile: \\ | ||
| + | $ c_1 \leq 1 $ \\ | ||
| + | $ c_2 \geq 2 $ | ||
| + | b. successor: \\ | ||
| - | === 2. K Clique === | + | Verificările de ieșire din recursivitate, calculul lui high și low, check-ul după max pentru a vedea dacă trebuie să căutăm succesorul lui x în același cluster cu x sau în următorul cluster nevid și calculul final al index-ului se realizează toate în timp constant, mărginit superior de o constantă $ C $. |
| + | Apelurile recursive se realizeză pe structuri de dimensiune radical din dimeniunea structurii originale (pe unul din clustere sau pe sumarul care reprezintă un vEB pentru indicii clusterelor, deci tot de aceași dimensiune precum clusters). \\ | ||
| + | $ T(u) = T(\sqrt{u}) + C, T(2) \leq C $. | ||
| - | Pentru problema K Clique, o soluție greedy ar fi să alegem noduri în funcție de gradul lor, adică să începem cu nodurile care au cei mai mulți vecini în graf. La fiecare pas, adăugăm un nod în setul nostru și eliminăm toate nodurile care nu sunt conectate la acesta. Continuăm acest proces până când avem un set de K noduri sau nu mai există noduri rămase în graf. | + | **Metoda arborilor:** \\ |
| + | Considerăm $ u = 2^{2^k} $ și pornim cu rădăcina arborelui $ T\left(2^{2^k}\right) $. \\ | ||
| + | Fiecare nivel $ h $ conține $ T\left(2^{2^{k - h}}\right) + C $ până la ultimul nivel care conține o singură frunză $ T(2) $. \\ | ||
| + | Ultimul nivel este nivelul $ k = \log \log u $. Suma este: \\ | ||
| + | $$ \left(\sum_{i=0}^{\log \log u - 1} C\right) + T(2) = C \log \log u + T(2) - C = \Theta(\log \log u) $$ | ||
| - | Cu toate acestea, o astfel de abordare greedy nu garantează întotdeauna găsirea unei clique de dimensiune maximă. | + | **Metoda substituției:** \\ |
| + | Vrem să demonstrăm că $ T(u) = \Theta(\log \log u) $, adică \\ | ||
| + | $ \exists(c_1, c_2, d_1, d_2 > 0)(U \geq 0): \forall(u \geq U): c_1 \log\log u - d_1 \leq T(u) \leq c_2 \log \log u + d_2 $ \\ | ||
| - | {{:aa:lab:sol:k_clique_counter_ex.png?nolink&300|}} | + | Cazul de bază: \\ |
| + | $ U = 2 $ \\ | ||
| + | $ c_1 \log\log 2 - d_1 = -d_1 \leq T(2) \leq C \leq c_2 \log\log 2 + d_1 = d_1 $ \\ | ||
| + | $ d_1 \geq 0,\ d_2 \geq C $ \\ | ||
| - | În cazul de față algoritmul propus va alege ca prim nod nodul $ 1$, va elimina nodurile $ 8$ și $ 9$ pentr că nu sunt conectate la el, după care va alege nodul $ 2$. Prin urmare, nu se poate obține o Clique de dimensiune $ 3$, în ciuda faptului că există una: {$ 2, 8, 9$}. \\ | + | Pasul inducției:\\ |
| - | \\ | + | pp. că $ c_1 \log \log \sqrt{u} - d_1 \leq T\left(\sqrt{u}\right) \leq c_2 \log \log \sqrt{u} + d_2 $ \\ |
| + | $ \Rightarrow c_1 \log\log\left(u^{1/2}\right) - d_1 = c_1 \log\left(\frac 12\log u\right) - d_1 \leq T\left(\sqrt u\right) \leq c_2 \log\log\left(u^{1/2}\right) + d_2 \leq \log\left(\frac 12\log u\right) + d_2 $ \\ | ||
| + | $ \Rightarrow c_1 \log\log u + c_1 \log\left(\frac 12\right) - d_1 = c_1 \log\log u - c_1 - d_1 \leq T\left(\sqrt u\right) \leq c_2 \log\log u + c_2 \log\left(\frac 12\right) + d_2 = c_2\log\log u - c_2 + d_2 $ \\ | ||
| + | $ \Rightarrow c_1 \log\log u - c_1 - d_1 + C \leq T\left(\sqrt u\right) + C \leq c_2\log\log u - c_2 + d_2 + C $ \\ | ||
| + | $ \Rightarrow \underbrace{(c_1 \log\log u - d_1) + (C - c_1)}_{\rm LHS} \leq T(u) \leq \underbrace{(c_2 \log\log u + d_2) + (C - c_2)}_{\rm RHS} $ \\ | ||
| + | Dacă $ C - c_1 \geq 0 $ și $ C - c_2 \leq 0 $ atunci \\ | ||
| + | $ \Rightarrow c_1 \log\log u - d_1 \leq {\rm LHS} \leq T(u) \leq {\rm RHS} \leq c_2 \log\log u + d_2 $ | ||
| + | În final avem condițiile: \\ | ||
| + | $ d_1 \geq 0, d_2 \geq C, $ \\ | ||
| + | $ c_1 \leq C \leq c_2 $ \\ | ||
| + | care sunt satifăcute, de exemplu, pentru $ d_1 = 0, d_2 = c_1 = c_2 = C $. | ||
| - | === 3. K Coloring === | + | 2. |
| - | + | * $ T(n) = 4T(n/4) + 1 $ | |
| - | Pentru fiecare nod, se alege cea mai mică culoare disponibilă care nu este marcată de vecinii nodului curent. Spre exemplu, pentru următorul graf (presupunem $ K = 2$): | + | $ a = 4;\ b = 4;\ f(n) = 1 = n^0,\ c = 0;\ d = \log_b a = \log_4 4 = 1;\ c < d $ \\ |
| - | + | Această recurență intră în cazul 1 al teoremei Master, deci $ T(n) = \Theta(n^d) = \Theta(n) $ | |
| - | {{:aa:lab:sol:k_coloring_ex.png?nolink&300|}} | + | * $ T(n) = 4T(\frac n 2) + n^2 $ |
| - | + | $ a = 4;\ b = 2;\ f(n) = n^2 = n^2 \log^0 n,\ c = 2,\ k = 0;\ d = \log_b a = \log_2 4 = 2;\ c = d $ \\ | |
| - | Avem $ 2$ culori disponibile, numerotate de la $1 $ la $ 2$. Inițial, $ [A → 0, B → 0, C → 0, D → 0, E → 0]$, adică niciun nod nu are asignată nicio culoare. | + | Această recurență intră în cazul 2 al teoremei Master, deci $ T(n) = \Theta(n^d \cdot \log^{k+1}n) = \Theta\left(n^2 \log n\right)$ |
| - | + | * $ T(n) = \frac{27}{8} T(2n/3) + n^3 \log^2 n + n^2 $ | |
| - | Pentru $ A$, vecinii săi nu au asignată nicio culoare. Îi asignăm lui A cea mai mică culoare disponibilă, adică $ 1$. $ [A → 1, B → 0, C → 0, D → 0, E → 0]$ | + | $ a = 27/8;\ b = 3/2;\ f(n) = n^3 \log^2 n + n^2 = \Theta\left(n^3 \log^2 n\right),\ c = 3,\ k = 2;\ d = \log_b a = 3;\ c = d $ \\ |
| - | + | Această recurență intră în cazul 2 al teoremei Master, deci $ T(n) = \Theta(n^d \cdot \log^{k+1}n) = \Theta\left(n^3 \log^3 n\right) $ | |
| - | Pentru $ B$, vecinii săi au asignat $ [1(A)]$ deci îi asignăm $ 2$.....................................................................$ [A → 1, B → 2, C → 0, D → 0, E → 0]$ | + | * $ T(n) = 8T(\frac n 2) + 2n^4 $ |
| - | + | $ a = 8;\ b = 2;\ f(n) = 2n^4,\ c = 4;\ d = \log_b a = \log_2 8 = 3;\ c > d $ \\ | |
| - | Pentru $ C$, vecinii săi au asignat $ [1(A)]$ deci îi asignăm $ 2$.....................................................................$ [A → 1, B → 2, C → 2, D → 0, E → 0]$ | + | Această recurență intră în cazul 3 al teoremei Master, iar $ f(n) = \Theta(n^c) $, deci $ T(n) = \Theta(f(n)) = \Theta\left(n^4\right) $ |
| - | + | * $ T(n) = 16T(n/4) + n^3\sqrt n $ | |
| - | Pentru $ D$, vecinii săi au asignat $ [2(B), 2(C)]$ deci îi asignăm $ 1$............................................................$ [A → 1, B → 2, C → 2, D → 1, E → 0]$ | + | $ a = 16;\ b = 4;\ f(n) = n^3\sqrt n = \omega(n^3),\ c = 3;\ d = \log_b a = \log_4 16 = 2;\ c > d $ \\ |
| - | + | Verificăm condiția de regularitate de la cazul 3 al teoremei Master: \\ | |
| - | Pentru $ E$, vecinii săi au asignat $ [1(D)]$ deci îi asignăm $ 2$.....................................................................$ [A → 1, B → 2, C → 2, D → 1, E → 2]$ \\ | + | $ a f(n/b) = 16 \left(\frac n 4\right)^3 \sqrt{\frac n 4} = 16\frac{n^3}{64} \frac{\sqrt n}{2} = \frac{1}{16}n^3\sqrt{n} = \frac{1}{16}f(n) $ \\ |
| - | \\ | + | Deci, $ k = \frac{1}{16} < 1 $ satisface $ a f(n/b) \leq kf(n) $ pentru orice $ n \geq 1 $. \\ |
| - | + | Suntem în condițiile cazului 3 al teoremei Master, deci $ T(n) = \Theta(f(n)) = \Theta(n^3\sqrt n) $ | |
| - | Contraexemplu: | + | |
| - | + | ||
| - | {{:aa:lab:sol:k_coloring_counter_ex.png?nolink&300|}} | + | |
| - | + | ||
| - | Acest contraexemplu poate fi acoperit dacă folosim o optimizare, și anume să asignăm culori nodurilor în ordinea dată de gradul lor, adică alegem mereu să asignăm culoare nodului de grad maxim. \\ | + | |
| - | \\ | + | |
| - | + | ||
| - | === 4. Hamilton Path + TSP === | + | |
| - | Pentru TSP, vom alege pe rând fiecare latura de cost minim și o luăm în considerare dacă adăugând-o la drumul format până acum, aceasta nu creează un ciclu sau un nod de grad $ 3$. Pentru Hamilton Path, pur și simplu nu vom mai ține cont de cost, luăm muchiile într-o ordine oarecare. | + | |
| - | + | ||
| - | Contraexemplu: | + | |
| - | + | ||
| - | {{:aa:lab:sol:tsp_counter_ex.png?nolink&300|}} | + | |
| - | + | ||
| - | În exemplul de față algoritmul de mai sus va genera calea $ A → B → C → D → E → F$ ce va avea costul total $ 29$, chiar dacă $ C → A → B → E → F → D$ are costul $ 28$. | + | |