Sunteți pe pagina 1din 18

Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Algoritmi paraleli şi distribuiţi


Algoritmi paraleli pe arbori

Mitică Craus

Universitatea Tehnică ”Gheorghe Asachi” din Iaşi

1/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Cuprins

Introducere
Parcurgerea euleriană a unui arbore
Descriere
Transformarea unui arbore neorientat ı̂n arbore cu rădăcină
Numerotarea vârfurilor ı̂n preordine şi postordine
Calculul relaţiilor ”este un descendent al lui ” şi ”este un strămoş al lui ”
Calculul minimului (maximului) valorilor din subarborele cu rădăcina ı̂ntr-un nod
oarecare:
Colorarea arborilor
Colorarea arcelor
Colorarea vârfurilor

2/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Introducere

• Arborii sunt obiectul unor calcule care deseori constituie taskuri ı̂n probleme de
grafuri.
• Sunt frecvente cazurile ı̂n care algoritmi polilogaritmici eficienţi sunt obţinuţi pe
baza unor calcule pe arbori.
• Problemele relative la arbori, abordate ı̂n acestă lecţie sunt:
1. Parcurgerea unui arbore ı̂n sens eulerian:
2. Aplicaţii ale parcurgerii euleriene:
2.1 Transformarea unui arbore neorientat ı̂n arbore cu rădăcină;
2.2 Numerotarea preordine si postordine a vârfurilor unui arbore;
2.3 Calculul relaţiilor ”este un descendent al lui ” şi ”este un strămoş al lui ”;
2.4 Calculul minimului (maximului) valorilor din subarborele cu rădăcina ı̂ntr-un nod oarecare.
3. Colorarea arborilor:
3.1 Colorarea arcelor;
3.2 Colorarea vârfurilor.

3/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Parcurgerea euleriană a unui arbore - descriere

• Fie T = (V , E ) un arbore cu V = {1, 2, ..., n} şi E ⊆ V × V , |E | = n − 1 Algoritmul


orientat PRAM cel mai cunoscut pentru parcurgerea euleriană a unui arbore T este
cel al lui Tarjan şi Vishkin.
• Un arbore nu este graf eulerian; din acest motiv, este transformat, prin orientarea
muchiilor, ı̂nlocuind fiecare muchie {i, j} cu două arce (i, j) şi (j, i).
• Graful rezultat, T 0 = (V , E 0 ), este eulerian deoarece pentru orice vârf v gradul
interior este egal cu cel exterior.
• Fie Eiout = { (i, i0 ); (i, i1 ); .. (i, id−1 ) } mulţimea arcelor ce ies dintr-un vârf i. Fără a
restrânge generalitatea se poate presupune că i0 < i1 < · · · < id−1 . Altfel, se sortează
Eiout conform cu ordinea crescătoare a valorilor ij , j = 0, 1, . . . , d − 1.
• Se defineşte succesorul unui arc astfel:
succ((i, ik )) = (i, ik⊕1 ), (∀)k ∈ {0, 1, . . . , d − 1} unde ⊕ este adunarea modulo d.
• Mulţimea Eiout ı̂mpreună cu funcţia succ definesc o listă circulară asignată vârfului i.
Pentru simplitate, şi mulţimea arcelor ce ies din vârful i şi lista circulară se notează
tot cu Eiout .

4/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Parcurgerea euleriană a unui arbore - pseudocod


• Notat, ii:
• A[1..2(n − 1)] este un tablou unidimensional, de dimensiune 2(n − 1).
• Tour Next[1..2(n − 1)] este un tablou unidimensional, de dimensiune 2(n − 1).
• Premise:
• Arborele este dat prin listele Eiout , i = 1, 2 . . . , n memorate ı̂ntr-un tablou A ı̂n ordinea
E1out , E2out , . . . , Enout .
• Elementul A[k] al tabloului A conţine perechea h(i, j), index(succ(i, j))i, unde
index(succ(i, j)) reprezintă indicele elementului ce conţine succ(i, j).
• A = ( h(1, i10 ), index(succ(1, i10 ))i; . . . ; h(1, i1d1 −1 ), index(succ(1, i1d1 −1 ))i;
h(2, i20 ), index(succ(2, i20 ))i; . . . ; h(2, i2d2 −1 ), index(succ(2, i2d2 −1 ))i;
. . . h(n, in 0 ), index(succ(n, in0 ))i; . . . ; h(n, indn −1 ), index(succ(n, indn −1 ))i;
• Rezultate:
• Lista euleriană LE va fi memorată ı̂n tabloul A.
• Elementul A[k] va conţine perechea h(i, j), Tour Next[(k]i

Parcurgere Euleriana Arbore(A, n)


1 for all k ∈ {1, 2, . . . , 2(n − 1)}
2 do in parallel
3 tour next[k] ← index(succ(j, i))/ ∗ k = index(i, j) ∗ /
4 for all k ∈ {1, 2, . . . , 2(n − 1)}
5 do in parallel
6 A[k] ← h(i, j), Tour Next[k]i

5/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Parcurgerea euleriană a unui arbore - complexitatea

• Problema cheie este calcularea, pentru arcul (i, j), a valorii index(succ(j,i)).
• Dacă se copie tabloul A ı̂ntr-un tablou B şi apoi se sortează tabloul B ı̂n ordinea
crescătoare a valorilor lui j, atunci B[k] va conţine h(j, i), index(succ(j, i))i.
• Aceasta presupune o fază de preprocesare de complexitate timp ≥ O(log n).
• În aceste condiţii, algoritmulPARCURGERE EULERIANA ARBORE(A, n) are
complexitate timp O(1), pe o maşină PRAM cu O(n) unităţi de procesare.

6/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Exemplu de parcurgere euleriană

Figura 1 : Exemplu de parcurgere euleriană pentru un arbore T , cu 7 vârfuri

7/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Parcurgerea euleriană a unui arbore - arce directe şi indirecte

• Se numerotează elementele listei LE prin intermediul procedurii CALCUL RANGURI.


• Rangurile rezultate vor fi modificate astfel ı̂ncât să reprezinte distanţa unui arc faţă
de primul element al listei LE .
• Dintre doua arce (i, j) şi (j, i), cel de rang mai mic este marcat ca fiind arc direct iar
celalt invers.
• Sublistele rezultate vor fi numite
• LED = lista arcelor directe, respectiv
• LEI = lista arcelor inverse.

8/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Exemplu de arce directe şi indirecte

Figura 2 : Exemplu de arce directe şi indirecte pentru arborele T

9/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Transformarea unui arbore neorientat ı̂n arbore cu rădăcină

• Fie (r , j) primul arc din tabloul A. Arborele neorientat T va fi transformat ı̂n arbore
cu rădăcina r . Pentru fiecare vârf i 6= r se determină părinte(i) ı̂n modul următor:
1. Se numerotează elementele listei LE prin intermediul procedurii CALCUL RANGURI.
2. Rangurile rezultate vor fi modificate astfel incât să reprezinte distanţa unui arc faţă de
primul element al listei LE . Dintre două arce (i, j) şi (j, i) cel de rang mai mic este
marcat ca fiind arc direct iar cealalt invers.
3. Sublistele rezultate vor fi numite LED = lista arcelor directe, respectiv LEI = lista
arcelor inverse.
4. Pentru fiecare arc direct (i, j), părinte[j] ← i.
• Pentru simplificarea limbajului vom nota index(succ(i, j)) cu index(succ(A[k]), dacă
A[k] = h(i, j), index(succ(i, j))i.

10/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Exemplu de transformare a unui arbore neorientat ı̂n arbore cu rădăcină

Figura 3 : Exemplu de transformare a arborelui neorientat T ı̂n arbore cu rădăcină

11/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Numerotarea vârfurilor ı̂n preordine şi postordine

• Numerotarea vârfurilor ı̂n preordine (postordine) se poate face pornind de la sublista


arcelor directe (inverse): LED (LEI ).
• Aplicând procedura de calculare a rangurilor elementelor listei LED (LEI ), se obţine
numerotarea preordine (postordine) prin atribuirea
pre ordine[j] ← rang [i, j] + 1 (post ordine[j] ← rang [(j, i)]).

12/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Exemplu de numerotare a vârfurilor ı̂n preordine şi postordine

Figura 4 : Exemplu de numerotare a vârfurilor arborelui T ı̂n preordine şi postordine

13/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Calculul relaţiilor ”este un descendent al lui ” şi ”este un strămoş al lui ”

• Vârful j este un descendent al lui i dacă şi numai dacă


pre ordine[i] ≤ pre ordine[j] < pre ordine[i] + nd[i].
• Calculul valorilor nd[i] (numărul descendenţilor lui i), i = 1, ..., n, se poate face astfel:
for each i : 1 ≤ i ≤ n
do in parallel
nd[i] ← 12 {rang [(i, părinte[i])] − rang [(părinte[i], i)]} + 1
• Analog, se poate calcula relaţia ”este un strămoş al lui ”.

14/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Exemplu de calculare a numărului de descenţi


d[4] = 21 {rang [(4, parinte[4])] − rang [(parinte[4], 4)]} + 1 = 12 {rang [(4, 1)] − rang [(1, 4)]} + 1 =
1
2 (12 − 1) + 1 = 6

Figura 5 : Exemplu de calculare a numărului de descenţi pentru vârful 4 al arborelui T


15/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Calculul minimului (maximului) valorilor din subarborele cu rădăcina ı̂ntr-un


nod oarecare:

• Fie V un vector de dimensiune n ce conţine valorile asociate vârfurilor unui arbore


considerate ı̂n preordine.
• Valorile asociate descendenţilor lui i se află ı̂n segmentul
S = V [pre ordine[i]..pre ordine[i] + nd[i] − 1].
• Aplicând procedura SUM(S, min) se obţine valoarea minimă a valorilor din
subarborele cu rădăcina i.

16/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Colorarea arcelor

• Culorile utilizate se noteazc̆u a 0,1,...,∆ − 1. Algoritmul se desfăşoară astfel:


1. Se transformă arborele T = (V , E ) ı̂ntr-un arbore cu rădăcină
2. Pentru fiecare vârf v se determină părintele s, i fii.
3. Pentru fiecare vârf v se colorează arcele (v , fiui (v )) cu culoarea i ≥ 1.
4. Pentru fiecare vârf v se calculează valoarea f (v ) = suma modulo ∆ a etichetelor
(culorilor arcelor) drumului de la rădăcină la v ; valoarea f (v ), se atribuie arcului
(părinte(v ), v ).
• Etichetarea obţinută este o colorare validă deoarece pentru orice x ∈ {0, 1, ..., ∆ − 1}
valorile x, x ⊕ 1, ..., x ⊕ (∆ − 1) sunt diferite. (⊕ = adunarea modulo ∆).
• Colorarea este optimă deoarece se utilizează cel mult ∆ culori.
• Paşii 1–4 necesită O(log n) timp paralel şi n procesoare (se utilizează primitive pe
arbori).
• Funcţia f se poate calcula prin tehnica dublării (scurtcircuitării) pe listele de
adiacenţă determinate de fii.
• Rezultă pentru ı̂ntregul algoritm T ∈ O(log n), iar p ∈ O(n).

17/ 18
Cuprins Introducere Parcurgerea euleriană a unui arbore Colorarea arborilor

Colorarea vârfurilor

• Prin tehnica dublării (scurtcircuitării) pe listele de adiacenţă determinate de fii, se


poate determina paritatea distanţelor vârfurilor faţă de rădăcină.
• Vârfurile situate la distanţă pară se colorează cu 0 şi celelalte cu 1.
• Evident, T ∈ O(log n) şi p ∈ O(n).

18/ 18

S-ar putea să vă placă și