Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | |||
|
aa:lab:11 [2025/01/23 14:09] dmihai |
aa:lab:11 [2026/01/10 23:52] (current) dmihai |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Analiza amortizata ===== | + | ====== Reduceri polinomiale ====== |
| - | Utilizați metoda agregării, metoda contabilizării și metoda potențialelor pentru a găsi costul amortizat în situațiile prezentate mai jos. | + | În acest laborator veți explora un graf realist cu date despre toate aeroporturile din lume și rutele dintre ele și veți aplica diverși algoritmi *eficienți* pe acesta. |
| + | Momentan, puteți considera termenul "eficient" să însemne "fără backtracking" (mai precis, ne referim la conceptul de polinomial, i.e. cu o complexitate descrisă de $ O(n^k)$, pentru un $ k$ natural; vom relua conceptul la curs). | ||
| - | $ \DeclareMathOperator{\push}{push} \DeclareMathOperator{\pop}{pop} \DeclareMathOperator{\mpop}{mpop} \DeclareMathOperator{\key}{key} \DeclareMathOperator{\cost}{cost} $ | + | Descărcați de aici arhiva cu datele de intrare: {{:aa:lab:lab.zip|}} |
| - | === 1. Stack === | + | Aceasta conține în directorul ''res/'' trei fișiere cu date despre aeroporturi și rute: |
| - | Presupunând că avem o implementare a unei stive care permite operațiile $ \pop - O(1) $, $ \push - O(1) $ si $ \mpop(k) - O(k) $, | + | - ''airroutes.in'' - din lume \\ |
| - | demonstrați că pentru o secvență arbitrară $ S $ de $ n $ operatii, $ \cost(S) = O(n) $ | + | - ''eu-airroutes.in'' - din Europa \\ |
| - | și că fiecare operație are un cost amortizat $ \cost(op) = O(1) $. | + | - ''ro-airroutes.in'' - din România |
| - | **Exemplu:** $ \push, \pop, \push, \push, \push, \mpop(2), \push, \pop, \push $ | + | Fișierele descriu grafuri orientate, ale căror noduri au ID-uri întregi începând de la 0; respectă următorul format: |
| - | === 2. Heap === | + | - pe prima linia, numărul de noduri ''N'' și numărul de muchii din graf, separate de un spațiu. \\ |
| + | - pe următoarele ''N'' linii, informații despre un nod \\ | ||
| + | - pe linia ''i'' (probabil indexată de la 1 în editorul de text), găsiți informații despre nodul cu ID ''i - 2'': \\ | ||
| + | - [[https://www.iata.org/en/publications/directories/code-search/|codul IATA]] al aeroporturlui \\ | ||
| + | - toate rutele de la acel aeroport exprimate folosind trei numere: ID-ul aeroportului destinație, distanța zborului în kilometri, durata zborului în minute. | ||
| - | Un max-heap este un arbore binar aproape complet - toate nivelurile, cu excepția ultimului, sunt complete, iar ultimul este completat de la stânga la dreapta. Fiecare două noduri AA și BB, unde BB este fiu al lui AA, satisfac relația: | + | <note> |
| - | $ \key(B) \leq \key(A) $ | + | Fișierele sunt doar o versiune parser-friendly a datelor din acest JSON: https://github.com/Jonty/airline-route-data/blob/main/airline_routes.json |
| - | Un max-heap se poate stoca sub formă de array, unde $ a[i] $ are | + | În ''tools/extract_c_friendly.py'' găsiți scriptul care a realizat extragerea. |
| - | copiii $ a[2i] $ si $ a[2i+1] $. | + | </note> |
| - | Adăugarea unui element constă în următorii pași: | + | ==== Exerciții ==== |
| - | - adaugă un element în prima poziție liberă de pe ultimul nivelele | + | |
| - | - compară elementul adăugat cu părintele și interschimbă-i dacă e cazul | + | |
| - | - repetă pasul anterior până nodul respectă proprietatea în raport cu părintele lui sau a devenit rădăcina | + | |
| - | Arătați că fiecare inserare are un cost agregat de $ \cost(op) = O(\log n) $. | + | BONUS: Aplicați backtracking naiv pentru a rezolva problema $ \texttt{MINIMAL COLORING}$ pe un graf primit ca input; i.e. găsiți numărul minim de culori distincte cu care putem colora nodurile din graf astfel încât să nu existe muchie între două noduri de aceeași culoare. |
| + | 1. Aplicați backtracking naiv pentru a rezolva problema $ \texttt{COLORING}$ pe graful respectiv; va trebui să mai primiți un argument numeric $ k$ și să determinați dacă graful poate fi colorat cu $ k$ culori. | ||
| - | === 3. Binary Counter === | + | BONUS: implementați o soluție pentru $ \texttt{MINIMAL COLORING}$ care să folosească soluția pentru $ \texttt{COLORING}$ cu o cantitate minimală de cod adițional. |
| - | Presupunând că avem un contor binar implementat folosind o listă de \( k \) biți, acesta permite doar operația \( increment \), care adaugă \( 1 \) la contor. Această operație are complexitate temporală \( O(k) \) în cel mai rău caz. Arătați însă că operația are un cost amortizat constant. | + | BONUS: implementați o soluție pentru $ \texttt{COLORING}$ care să folosească soluția pentru $ \texttt{MINIMAL COLORING}$ cu o cantitate minimală de cod adițional. |
| + | |||
| + | |||
| + | 2. Implementați transformarea necesară pentru reducerea $ \texttt{COLORING} \le_P \texttt{CNF SAT}$: | ||
| + | |||
| + | - creați câte o variabilă $ x_{v, c}$ pentru fiecare pereche de nod și culoare $ (v, c)$ \\ | ||
| + | - fiecare nod trebuie să aibă cel puțin o culoare; adăugați pentru fiecare nod $ v$ clauza: $ (x_{v, 0} \lor x_{v, 1} \lor \ldots \lor x_{v, k - 1})$ \\ | ||
| + | - fiecare nod trebuie să aibă maxim o culoare; pentru fiecare nod $ v$ și pentru fiecare pereche de culori $ c1 < c2$ adăugați clauza: $ (\overline{x_{v, c1}} \lor \overline{x_{v, c2}})$ \\ | ||
| + | - două noduri adiacente nu pot avea aceeași culoare; pentru fiecare pereche de noduri $ (u, v)$ și pentru fiecare culoare $ c$ adăugați clauza: $ (\overline{x_{v, c}} \lor \overline{x_{u, c}})$ | ||
| + | |||
| + | 3. Implementați o soluție pentru a rezolva $ \texttt{CNF SAT}$ prin backtracking naiv. | ||
| + | |||
| + | 4. Convertiți formula voastră in formatul [[https://jix.github.io/varisat/manual/0.2.0/formats/dimacs.html|DIMACS]] și rezolvați-o cu un SAT solver. | ||
| <note> | <note> | ||
| - | Soluțiile acestui laborator se găsesc [[https://ocw.cs.pub.ro/ppcarte/doku.php?id=aa:lab:sol:11|aici]] | + | Ca SAT solver, vă recomandăm [[https://github.com/Z3Prover/z3|Z3]] de la Microsoft Research. |
| + | Acesta este de fapt un solver de $ \texttt{SMT}$ (//Satisfiability Modulo Theories//), o problemă mai generală, dar poate rezolva și $ \texttt{SAT}$. | ||
| + | Cel mai probabil, distribuția voastră are Z3 disponibil ca pachet în repositories default. | ||
| + | Dacă nu, instalați [[https://github.com/Z3Prover/z3/releases|ultimul release]]. | ||
| + | </note> | ||
| + | |||
| + | <note> | ||
| + | Formatul DIMACS este un format standard pentru a descrie instanțe de probleme $ \texttt{CNF SAT}$. | ||
| + | |||
| + | În fiecare an are loc o [[https://satisfiability.org/SAT26/|conferință faimoasă]] pe tema problemelor de satisfiabilitate. | ||
| + | Conferința are și o competiție de SAT solving asociată; puteți găsi [[https://satcompetition.github.io/2025/downloads.html|aici]] submisiile pentru anul acesta; vă recomandăm să încercați să rulați și unul din aceste solvere, pe lângă Z3 (Z3 este un produs finisat și robust, pe o problemă mai generală; aceste solvere doar rezolvă instanțe de SAT; e posibil să fie mai rapide). | ||
| </note> | </note> | ||