Diferente pentru tree-decompositions intre reviziile #59 si #60

Diferente intre titluri:

Heavy path decomposition
Tree decompositions

Diferente intre continut:

h1. Heavy path decomposition
h1. Tree decompositions
(Categoria _Algoritmi_, autor _Marius Stroe_)
Acest articol prezinta studiul unei probleme ce urmareste determinarea eficienta a valorii maxime/minime aflata pe lantul elementar dintre doua noduri date dintr-un arbore. Mentionez ca, in acest articol, _lant_ va insemna intotdeauna _lant elementar_ (un nod poate aparea cel mult odata).
(toc){width: 20em}*{text-align:center} *Conţinut:*
* '{*} Liniarizare':heavy-path-decomposition#liniarizare
** 'Solutie $O((M+N)*log(N))$':heavy-path-decomposition#solutie-liniarizare
* '{*} Descompunere in lanturi':heavy-path-decomposition#descompunere-in-lanturi
** 'Solutie $O(M*N)$':heavy-path-decomposition#solutie-descompunere-brute
** 'Solutie $O(M*log^2^(N))$':heavy-path-decomposition#solutie-descompunere
* '{*} Aplicatii':heavy-path-decomposition#aplicatii
* '{*} Bibliografie':heavy-path-decomposition#bibliografie
h2. Enunt
Acest articol prezinta studiul transformarii unui arbore pentru calcularea eficienta a unei insumari si a valorii maxime/minime aflata pe lantul elementar dintre doua noduri. Mentionez ca, in acest articol, $lant$ va insemna intotdeauna $lant elementar$ (un nod poate aparea cel mult odata).
In continuare voi prezenta enuntul unui tip de problema ce a aparut la multe dintre concursurile de informatica. Motivul pentru care am ales acest lucru este ca unii participanti pot fi tentati sa incerce sa adapteze rezolvarea acesteia la rezolvarea problemei ce necesita _heavy path decomposition_, lucru ce nu este posibil, pierzandu-se astfel timp pretios. Iata enuntul:
h2(#liniarizare). Liniarizare
 
Un enunt care apare frecvent la concursurile de informatica este urmatorul:
Fie $G = (V, E)$ un graf neorientat conex, $|E| = |V| - 1$ (pe scurt, un arbore). Vom considera ca fiecare nod $x &#8712; V$ are asociata o valoare $value[x]$ din multimea numerelor reale. Se dau $M$ instructiuni, $M <= 200000$, de doua tipuri:
* primul tip cere sa se afiseze suma valorilor tuturor nodurilor ce se afla pe lantul dintre $x, y &#8712; V$ (practic, daca $P = (x{~0~},x{~1~}, x{~2~}, ..., x{~n~}), x{~0~} = x si x{~n~} = y$, este lantul ce uneste cele doua noduri, atunci se cere $&#916; = &#8721; value[u]$, $u &#8712; P$)
* al doilea tip modifica valoarea atasata unui nod.
h2. Solutia $O((M+N)*log(N))$
h3(#solutie-liniarizare). Solutia $O((M+N)*log(N))$
Solutia se foloseste de o tehnica numita liniarizarea arborelui. Aceasta presupune o parcurgere in adancime si retinerea unor informatii necesare pentru interogare si actualizare: $seq[]$, $firstPos[]$, $lastPos[]$. Iata pseudocodul acestei parcurgeri:
Astfel, s-a construit vectorul $seq[]$ care are urmatoarea proprietate: &#34;daca $&#916; = &#8721; seq[i]$, $firstPos[x] <= i <= firstPos[y]$, x fiind un stramos al lui y, atunci &#916; reprezinta $&#8721; value[u]$, $u &#8712; P$, $P = (x{~0~}, x{~1~}, x{~2~}, ..., x{~n~}), x{~0~} = x si x{~n~} = y&#34;$. Conform acesteia, daca vom determina cel mai apropiat stramos comun dintre doua noduri, atunci nu va fi nevoie decat de o structura de date ce permite calcularea intr-un mod eficient a sumei pe un interval din $seq[]$ si modificarea unei valori din acest vector. Putem obtine complexitatea $O(log(N))$ pe fiecare din cele doua operatii folosind structura de date numita arbori de intervale. Pentru determinarea eficienta a celui mai apropiat stramos comun si pentru detalii despre arborii de intervale consultati bibliografia.
h2. Enunt
h2(#descompunere-in-lanturi). Descompunere in lanturi
Acum ne vom concentra asupra sarcinii initiale, de determinare a valorii de maxim/minim. Enuntul este urmatorul:
Acum ne vom concentra asupra urmatoarei sarcini, de determinare a valorii de maxim/minim. Sa urmarim enuntul de mai jos.
Fie $G = (V, E)$ un graf neorientat conex, $|E| = |V| - 1$ (yup, tot arbore). Vom considera, bineinteles, ca fiecare nod $x &#8712; V$ are asociata o valoare $value[x]$ din multimea numerelor reale. Se dau $M$ instructiuni, $M <= 200000$, de doua tipuri:
* primul tip cere sa se scrie maximul dintre valorile nodurilor ce se afla pe lantul dintre $x, y &#8712; V$ (daca $P = (x{~0~},x{~1~}, x{~2~}, ..., x{~n~}), x{~0~} = x si x{~n~} = y$,  atunci se cere $&#916; = Maxim {value[u] | u &#8712; P}$)
* al doilea tip modifica valoarea asociata unui nod.
h2. Solutia $O(M*N)$
h3(#solutie-descompunere-brute). Solutia $O(M*N)$
Sunt o multitudine de solutii simple ce ne pot trece prin minte. Pentru cea aleasa de mine voi retine un vector $parent[]$ semnificand parintele unui nod calculat printr-un depth-search, si $depth[]$ ce retine adancimea, adica numarul de muchii de la radacina pana la nodul interogat. Cu ajutorul lor, urmatorul pseudocod rezolva primul tip de cerinta:
Rezolvarea cerintei a doua se face simplu in $O(1)$ modificand direct $value[]$.
h2. Solutia $O(M*log^2^(N))$
h3(#solutie-descompunere). Solutia $O(M*log^2^(N))$
Voi prezenta intr-un mod indirect cum se ajunge la aceasta complexitate, intrucat exista o solutie relativ asemanatoare celei pe care mi-am propus sa o prezint, insa nu la fel de rapida, numita _longest path decomposition_. Si, desigur, nu este rau daca stim ceva in plus. :)
Voi prezenta intr-un mod indirect cum se ajunge la aceasta complexitate, intrucat exista o solutie relativ asemanatoare celei pe care mi-am propus sa o prezint, insa nu la fel de rapida, numita $longest path decomposition$. Si, desigur, nu este rau daca stim ceva in plus. :)
Tehnica liniarizarii arborelui nu ne este de folos, deoarece modul de reprezentare a informatiilor nu permite obtinerea unei complexitati mai bune fata de solutia brute force prezentata mai sus.
Insa, cu _longest path decomposition_, tehnica ce necesita cunostine minime despre grafuri, vom obtine complexitatea $O(M*sqrt(N)*log(N))$ urmand pasii de mai jos:
Insa, cu $longest path decomposition$, tehnica ce necesita cunostine minime despre grafuri, vom obtine complexitatea $O(M*sqrt(N)*log(N))$ urmand pasii de mai jos:
# Elimina cel mai lung lant radacina-frunza din arbore si apeleaza recursiv pentru restul componentelor conexe;
# Retine fiecare lant ca un vector $Path[].array[]$ cu noduri ordonate crescator dupa adancime si pastreaza un pointer catre nodul din lantul sau parinte $Path[].parent$;
Complexitatea finala: $O(M*sqrt(N)*log(N))$. Cel mai rau caz pentru un query este cand se trece prin toate lanturile (in numar de $sqrt(N)$) efectuandu-se cate un query pe fiecare arbore de intervale asociat ({$O(log(N))$}).
O imbunatatire pentru aceasta metoda o reprezinta $heavy path decomposition$, care se foloseste de acelasi algoritm, cu exceptia faptului ca fiul ales pentru determinarea unui lant este cel cu numar maxim de noduri in subarborele sau (heavy) si nu cel cu inaltimea maxima (longest). Prin urmare, numarul maxim de lanturi prin care se trece pentru a ajunge de la un nod la radacina este cel mult $O(log(N))$ dupa cum se poate vedea si in figura urmatoare:
O imbunatatire pentru aceasta metoda o reprezinta $heavy path decomposition$, care se foloseste de acelasi algoritm, cu exceptia faptului ca fiul ales pentru determinarea unui lant este cel cu numar maxim de noduri in subarborele sau (heavy) si nu cel cu inaltimea maxima (longest). Prin urmare, numarul maxim de lanturi prin care se trece pentru a ajunge de la un nod la radacina este cel mult $O(log(N))$ dupa cum se poate vedea si din figura urmatoare:
_Fig. 3: Fiecare nod apartine unui singur lant. Lanturile sunt reprezentate de muchii solide._
!heavy-path-decomposition?Figura3.jpg!
Complexitatea finala: $O(M log^2^(N))$. In practica, aceasta tehnica se comporta foarte bine si poate fi folosita cu succes. Singurul dezavantaj este ca trebuie scrise multe linii de cod. Voi incerca sa obtin o solutie cat mai scurta cu _heavy path decomposition_ si o voi atasa acestei pagini pentru cei curiosi. :)
Complexitatea finala: $O(M log^2^(N))$. In practica, aceasta tehnica se comporta foarte bine si poate fi folosita cu succes. Singurul dezavantaj este ca trebuie scrise multe linii de cod.
h2. Aplicatii
h2(#aplicatii). Aplicatii
* "Query on a tree":http://www.spoj.pl/problems/QTREE/ - spoj, 375
* "Caves and tunnels":http://acm.timus.ru/problem.aspx?space=1&num=1553 - timus, Novosibirsk SU Contest, Petrozavodsk training camp, September 2007
* "Arbfind":problema/arbfind - pregatirea lotului national de informatica, 2006.
* "CT":problema/ct - Happy Coding 2006
h2. Bibliografie
h2(#bibliografie). Bibliografie
* "Introducere in algoritmi", autori Thomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest
* "Arbori de intervale si aplicatii in geometrie":arbori-de-intervale, autor Dana Lica

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.