! "
#
$
# &
%
#
$)
(*
'# + ,-..
*
'#
( #
&
)
Cu p r ins 1
Intr o du cer e
3
2
Range Minimum Query 2.1 Solu¸tie hO(1), O(n)i . . . 2.2 Solu¸tie hO(n3 ), O(1)i . . . 2.3 Solu¸tie hO(n2 ), O(1)i . . . √ 2.4 Solu¸tie hO(n), O( n)i . . 2.5 Solu¸tie hO(nlog(n), O(1)i
5 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.6
RMQ 2-Dimensional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.7
Arbori de inter vale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.7.2
Constr uc¸tia arborelui de inter vale . . . . . . . . . . . . . . . . . . . . 15 Actualizar ea arborelui de inter vale . . . . . . . . . . . . . . . . . . . 16
2.7.3
Inter ogar ogar ea arborelui de inter vale . . . . . . . . . . . . . . . . . . . .
17
Un caz par ticular de RMQ: RMQ ± 1 . . . . . . . . . . . . . . . . . . . . .
18
2.7.1
2.8 3
Lowest Common A n cestor 3.1 Solu¸tie hO(n), O(n)i . . . . . . . . . . . . . . . . √ 3.2 Solu¸tie hO(n), O( n)i . . . . . . . . . . . . . . . 3.3 Solu¸tie hO(nlog(n)), O(log(n))i . . . . . . . . . . amo¸s 3.3.1 Problema aflarii celui de-al j -lea str am 3.4 Un algor itm off-line simplu pentru calculul LC A ˘
3.5
3.6 4
5
7
23 . . . . . . . . . . . . . . .
24
. . . . . . . . . . . . . . .
25
. . . . . . . . . . . . . . .
28
. . . . . . . . . . . . . . . 29 . . . . . . . . . . . . . . .
Algor itmul off-line al lui Tarjan . . . . . . . . . . . . . . . . . . . . . . . . .
3.5.1
Mul¸timi dis juncte
3.5.2
Algor it mul lui Tarjan
−
33
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 . . . . . . . . . . . . . . . . . . . . . . . . . .
LC A pe arbori binari com ple¸ti . . . . . . . . . . . . . . . . . . . . . . . . .
E chivale n¸ta RM Q
32
35 37
42
LC A
4.1
Reducerea problemei LC A la problema RM Q . . . . . . . . . . . . . . . . .
42
4.2
Reducerea problemei RM Q la problema LC A . . . . . . . . . . . . . . . . .
45
A plica¸ tii ale problemei LC A 5.1 Problema sumei pe un arbore static
50 . . . . . . . . . . . . . . . . . . . . . .
50 52
5.3
Problema sumei pe un arbore dinamic . . . . . . . . . . . . . . . . . . . . . Problema minimului/maximului pe un arbore static . . . . . . . . . . . . .
57
5.4
Problema minimului pe minimului pe un arbore dinamic . . . . . . . . . . . . . . . . . . .
60
5.2
5.4.1
Solu¸tie utilizand descompunerea dup˘ a cel mai lung lan¸t
1
. . . . . . .
61
Cu p r ins 1
Intr o du cer e
3
2
Range Minimum Query 2.1 Solu¸tie hO(1), O(n)i . . . 2.2 Solu¸tie hO(n3 ), O(1)i . . . 2.3 Solu¸tie hO(n2 ), O(1)i . . . √ 2.4 Solu¸tie hO(n), O( n)i . . 2.5 Solu¸tie hO(nlog(n), O(1)i
5 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.6
RMQ 2-Dimensional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.7
Arbori de inter vale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.7.2
Constr uc¸tia arborelui de inter vale . . . . . . . . . . . . . . . . . . . . 15 Actualizar ea arborelui de inter vale . . . . . . . . . . . . . . . . . . . 16
2.7.3
Inter ogar ogar ea arborelui de inter vale . . . . . . . . . . . . . . . . . . . .
17
Un caz par ticular de RMQ: RMQ ± 1 . . . . . . . . . . . . . . . . . . . . .
18
2.7.1
2.8 3
Lowest Common A n cestor 3.1 Solu¸tie hO(n), O(n)i . . . . . . . . . . . . . . . . √ 3.2 Solu¸tie hO(n), O( n)i . . . . . . . . . . . . . . . 3.3 Solu¸tie hO(nlog(n)), O(log(n))i . . . . . . . . . . amo¸s 3.3.1 Problema aflarii celui de-al j -lea str am 3.4 Un algor itm off-line simplu pentru calculul LC A ˘
3.5
3.6 4
5
7
23 . . . . . . . . . . . . . . .
24
. . . . . . . . . . . . . . .
25
. . . . . . . . . . . . . . .
28
. . . . . . . . . . . . . . . 29 . . . . . . . . . . . . . . .
Algor itmul off-line al lui Tarjan . . . . . . . . . . . . . . . . . . . . . . . . .
3.5.1
Mul¸timi dis juncte
3.5.2
Algor it mul lui Tarjan
−
33
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 . . . . . . . . . . . . . . . . . . . . . . . . . .
LC A pe arbori binari com ple¸ti . . . . . . . . . . . . . . . . . . . . . . . . .
E chivale n¸ta RM Q
32
35 37
42
LC A
4.1
Reducerea problemei LC A la problema RM Q . . . . . . . . . . . . . . . . .
42
4.2
Reducerea problemei RM Q la problema LC A . . . . . . . . . . . . . . . . .
45
A plica¸ tii ale problemei LC A 5.1 Problema sumei pe un arbore static
50 . . . . . . . . . . . . . . . . . . . . . .
50 52
5.3
Problema sumei pe un arbore dinamic . . . . . . . . . . . . . . . . . . . . . Problema minimului/maximului pe un arbore static . . . . . . . . . . . . .
57
5.4
Problema minimului pe minimului pe un arbore dinamic . . . . . . . . . . . . . . . . . . .
60
5.2
5.4.1
Solu¸tie utilizand descompunerea dup˘ a cel mai lung lan¸t
1
. . . . . . .
61
CUPRI NS
2
Ca pitolul 1 5.4.2
Bibliografie
Un alt tip de descompunere a arborelui
. . . . . . . . . . . . . . . .
68
72
CUPRI NS
2
Ca pitolul 1
Intr o ducer e Problema studiat˘ a ˆın aceast˘ a lucrare este aflarea celui mai apropiat str amo¸s comun a unei perechi de noduri dint r -un arbore (eng.
Lowest Common Ancest or ).
Aceast˘ a
problema a atras f oar te mult aten¸tia ¸si a f ost studiat˘ a intens ˆın ultimele trei decenii at at
pentru f aptul ca este f oar te inter esanta din punct de vedere algor itmic, cat ¸si p entr u numeroasele sale aplica¸tii ın domenii variate ale informaticii. Domeniile ın care ı¸si gase¸ste cele mai multe aplica¸tii sunt procesarea ¸sirurilor de car acter e ¸si biologia com puta¸tionala, unde este f re cvent f olosita cu arbori de sufixe (eng. suffix tr ees) pentru a gasi cel mai lung prefix comun pentru doua sufixe. Alte domenii ın care aceast a pr oblema este utilizata sunt constr uc¸tia compilatoarelor, testarea VLSI sau testarea planar ita¸tii. ˘
˘
ˆ
ˆ
ˆ
˘
˘
˘
˘
˘
ˆ
˘
˘
˘
˘
S˘ a luam un exemplu mai pu¸tin abstract: arborele evolu¸tiei vie¸tii pe Pamant. Char les
Darwin a propus o teor ie ˆın care toate speciile existente au evoluat din alte specii. Aceasta ˘
structura poate fi modelat a sub forma unui arbore ın care fiecare nod r e pr ezinta o s pecie, iar fiii unui nod r e pr ezint a speciile ce au evoluat dir ect din specia cor es punzatoar e nodului tata. Gasind cel mai apropiat str amo¸s comun pentru doua noduri din acest ar b or e, vom gasi de f apt par intele comun din care au evoluat cele doua specii ¸si putem deter mina car acter isticile comune mo¸stenite de la acest par int e. ˘
ˆ
˘
˘
˘
˘
˘
˘
Problema Lowest Common Ancestor (LCA) a f ost definit˘ a de Alfred Aho, John Hopcr of t s¸i Jeff re y Ullman ın 1973, dar Dov Harel ¸si R ober t Tarjan au f ost primii care au dezvoltat o str uctur a de date pentru rezolvarea eficient a a problemei. Algor it mul propus de ei pr e pr oceseaza arborele ın tim p liniar ¸si poate oferi raspunsul la orice inter ogar e ce solicita LCA-ul a doua noduri ın tim p const ant , dar structura de date f olosita este f oar te com plexa ¸si dificil de im plementat. Tarjan a propus apoi un alt algor itm, de aceasta data offline, mult mai simplu, dar mai pu¸tin eficient, ce f olose¸ste ca str uctur a de date auxiliar a mul¸timile dis juncte. In 1988, Baruch Schieber ¸si Uzi Vishkin [5] au pr ezentat un alt algor itm pentru pr oblema LCA mult mai simplu decat cel propus de Harel ¸si Tarjan ¸si avand aceea¸si com plexitat e tim p. Acest algor itm se baza pe sim plitat ea problemei LCA pe doua tipuri speciale de arbori: daca arborele este liniar, atunci LCA-ul a doua noduri este nodul cu adancimea minima, iar pentru un arbore binar com plet , nodurile pot fi numerotate ın a¸sa fel ıncat calculul LCA-ului se va reduce la oper a¸tii binare ale indicilor. In cazul unui arbore oar ecare, se r ealizeaza o mapare a acest uia la un arbore binar. S ¸ i acest algor itm este ınsa ˆ
˘
˘
˘
ˆ
˘
˘
ˆ
˘
˘
˘
˘
˘
˘
ˆ
˘
˘
˘
ˆ
ˆ
ˆ
˘
ˆ
3
˘
Capitolul 1. Intr oducer e
4
Ca pitolul 2 de par te de a fi simplu ¸si nu tocmai u¸sor de im plementat . Omer Berkman ¸si Uzi Vishkin au descoper it ˆın anul 1993 o metod˘ a com plet nou˘ a de a calcula cel mai apropiat str amo¸s comun. Aceast˘ a solu¸tie se bazeaz˘ a pe reducerea pr oblemei LCA la o alt˘ a: g˘ asir ea p ozi¸tiei valorii minime pe un inter val a pr oblem˘ a bine cunoscut˘ al unei secven¸te de numere (Range Minimum Query). Aceast˘ a metod˘ a a f ost pr ezentat ˘ a ın 2000 ˆıntr -o f orm˘ a sim plificat˘ a de Michael Bender ¸si Mar tin Far ach-Colton [1].
ˆ
Capitolul 2 este dedicat studiului problemei Range Minimum Query (RMQ). Vom pr ezenta mai multe solu¸tii, dar ma jor itatea se vor baza pe aceea¸si idee: ˆım par ¸tir ea secven¸tei ˆın anumite inter vale ¸si calculul p ozi¸tiei minimului pe acestea ˆın etapa de pr e procesare, astf el ˆıncat atunci cand primim o ˆıntr e bar e ce solicit˘ a minimul pe un inter val oarecare s˘ a putem ob¸tine rapid valoarea cautat ˘ a folosind inf orma¸tiile precalculate. ˆIn sec¸tiunea 2.6 vom pr ezenta o solu¸tie pentru problema RMQ-2D, o extinder e a pr oblemei RMQ. Vom descrie apoi ˆın sec¸tiunea 2.7 structura de arbore de inter vale, o str uct ur a de date care of er ˘ a o solu¸tie atˆat pentru versiunea static˘ a a problemei RMQ (ˆın care elementele secvent¸ei raman neschimbate), cat ¸si pentru cea dinamic˘ a (ˆın care sunt per mise modificari ale elementelor secven¸tei). Capitolul se ˆıncheie cu pr ezentar ea unui caz par ticular de RMQ: RM Q ± 1. ˆ In aceasta pr oblem˘ a, secven¸ta de numere tr e buie sa r es pecte o condi¸tie ˆın plus: oricare dou˘ a elemente consecutive tr e buie s˘ a difere cu exact o unitat e. ˆ In capitolul 3 vom pr ezenta cateva solu¸tii neoptime ale problemei LCA. ˆ In sec¸tiunile In sec¸tiunea 3.4 3.1, 3.2 ¸si 3.3 sunt descr i¸si trei algor it mi on-line pentru calculul LCA. ˆ este discutat un algor it m off-line simplu pentru problema LCA, iar ˆın sec¸tiunea 3.5 vom descrie algor it mul off-line al lui Tarjan bazat pe mul¸timi dis juncte. ˆIn sec¸tiunea 3.6 vom pr ezenta un algor itm care, ˆın urma unei preprocesari ˆın tim p liniar, va putea raspunde ˆın tim p constant la inter ogar i ce solicit˘ a LCA-ul a dou˘ a noduri ˆıntr -un arbore binar com plet. ˆ In capitolul 4 vom arata cum se poate reduce problema LCA la problema RMQ, iar apoi cum putem tr ece de la problema RMQ la o pr oblem˘ a LCA. Utilizand aceste r educer i vom pr ezent a solu¸tii optime atat pentru problema LCA, cˆ at ¸si pentru problema R MQ. Ultimul c apitol este dedicat studiului unor probleme de inter ogar e pe arbori ce f olosesc problema LCA ca pas inter mediar ˆın rezolvarea lor. Vom pr ezenta algor it mi pentru a afla suma ¸si valoarea minima/m axim˘ a pe un lan¸t dintr -un arbore ˆın care fiecarui nod i se asociaz˘ a ponderi. Aceste probleme vor fi discutat e pentru dou˘ a tipuri de arbori: stat ici
(ın acest caz ponderilor nodurilor r aman neschimbate) ¸si dinamici (ın care sunt p er mise modificari ale ponderilor nodur ilor ). ˆ
ˆ
ˆ
Capitolul 1. Intr oducer e
5
Ca pitolul 2
Range Minimum Quer y Problema Range Minimum Query (RMQ) este definit˘ a astf el: fiind dat un vector A[ ] de dimensiune n cu elemente dintr -o mul¸time total or donat ˘ a (cu r ela¸tia de or dine ”≤”), RM QA (i, j) r etur neaz˘ a indicele celui mai mic element din subvector ul A[i, j ], adic˘ a RM QA (i, j) = arg mink ∈{i... j } {A[k ]}. Dac˘ a valoarea minim˘ a apare de mai multe ori ˆın subvector ul A[i, j ], atunci se va returna prima p ozi¸tie pe care aceast a apar e. ar i (query-uri) de ti pul RM QA (i, j ) De r egul˘ a ni se d˘ a vector ul A ¸si un set de ˆıntr e b˘ la care tr e buie s˘ a raspundem cˆ at mai eficient. Se consider ˘ a c˘ a vector ul este static (nu se schim b˘ a valori ale elementelor vector ului, nu se insereaza noi elemente ¸si nu se ¸ster g elemente), iar query-urile nu sunt cunoscute ˆın avans algor it mului. De accea ar fi convenabil s˘ a preprocesam vector ul A utilizˆ and eventual o stuctur ˘ a de date auxiliara, iar apoi s˘ ar i ¸si, utilizand datele r ezultat e din preprocesarea ana parcurgem lista de ˆıntr e b˘ ter ioar ˘ at mai repede la acestea. Vom intr oduce o nota¸tie ce va fi a s˘ a putem raspunde cˆ ar i: pentru un algor itm cu com plexitatea pr e pr ocesar ii f olosit˘ a pe parcursul ˆıntr egii lucr ˘ O(f (n)) ¸si com plexitatea raspunsului la o ˆıntr e bar e O(g(n)), vom nota com plexitatea total˘ a hO(f (n)), O(g(n))i.
Figura 2.1: Problema RMQ pe un vector de 10 elemente
Am pr ezentat pana acum versiunea clasic˘ a a problemei RMQ. Ea se poate ˆınsa extinde f oar te u¸sor la dou˘ a dimensiuni (RMQ-2D), pr oblem˘ a ˆın care fiind dat ˘ a o matr ice de dimensiune n × n se cere minimul pe un anumit dr e pt unghi specificat al matricii. De asemenea, RMQ poate fi gener alizat˘ a ¸si pe grafuri (BEQ - Bottleneck Edge Query ). ˆIn aceast˘ a pr oblem˘ a ni se d˘ a un graf cu costur i pe muchii ¸si se cere capacitat ea maxim˘ a care se poate realiza ˆıntr e dou˘ a noduri u ¸si v specificate. Capacitatea unui drum ˆıntr e dou˘ a noduri este dat˘ a de costul minim de pe muchiile drumului. Pe un graf liniar, aceast˘ a pr oblem˘ a se reduce la RMQ. Vom pr ezenta la un moment dat o solut¸ie f oar te inter esant˘ a pentru RMQ-2D pentru a sublinia cat de u¸sor se poate face extinder ea de la RMQ clasic, ınsa aceste dou˘ a probleme nu pr ezint˘ a inter es ˆın aceast˘ a lucrare ¸si nu vor fi apr of und ate. ˆ 5
Capitolul 2. Range Minimum Quer y
2.1
6
tie hO(1), O(n)i Solu¸
O solu¸tie imediat˘ at oar ea: a ¸si extr em de sim pl˘ a ar fi ur m˘
Pr e pr oc esar e: Nu ef ectuam nicio modificare asupra vector ului ın aceasta etapa; vom avea a¸sadar com plexitatea tim p O(1). as puns: Pentru fiecare ıntr e bar e RM QA (i, j) parcurgem vector ul de la indicele i R ˘ pana la indicele j ¸si r e¸tinem p ozitia minimului dintr e elementele parcurse. Pentru o ıntr e bar e, cazul cel mai nefavorabil este sa avem i = 0, j = n − 1, caz ın care va tr e bui sa parcurgem tot vect or ul ¸si vom ob¸tine o com plexitat e tim p O(n). Singurul avantaj al acestei meto de este ca f olose¸ste memorie suplimentar a O(1), ınsa este f oar te lent a. ˆ
˘
ˆ
˘
ˆ
˘
ˆ
˘
˘
2.2
˘
ˆ
˘
Solu¸ tie hO(n3), O(1)i
O alt˘ a solu¸tie, la fel de sim pl˘ a ca cea de mai sus, este ur matoar ea:
Pr e pr oc esar e: Vom stoca raspunsul la orice tip de ıntr e bar e ar putea aparea ıntr -o matrice C[ ][ ] de dimensiune n × n, C [i][ j ] = RM QA (i, j). Constr uc¸tia acestei matrici este f oar te simpla: pentru fiecare celula (i, j) parcurgem vector ul de la indicele i pana la indicele j ¸si ini¸tializam C [i][ j ] cu pozi¸tia minimului dintr e elementele parcurse. Com plexitatea preprocesarii este O(n 3 ) deoarece pentru ini¸tializar ea unei celule a matricii ın cel mai defavorabil caz vom parcurge ıntr egul vect or . ˆ
ˆ
˘
˘
ˆ
ˆ
Algor itmul 2.1: Preprocesarea vector ului A (solu¸tie hO(n3 ), O(1)i) Preprocess(A, C, n ) b egi n for i ←− 0 to n − 1 do for j ←− i to n − 1 do Min = A[i]; PosMin = i; for k ←− i + 1 to j do if A[k] < M in then Min = A[k]; PosMin = k ; C[i][ j ] = PosMin;
as puns: Pentru orice query RM QA (i, j) avem stocat raspunsul ın celula (i, j) a R ˘ matricii C. Raspunsul se poate deci ef ectua ın O(1). ˆ
ˆ
Observam c˘ a aceast˘ a metod˘ a f olose¸ste O(n 2 ) memorie suplimentar a. Pr ezentam mai jos matricea C ob¸tinut˘ a ˆın urma preprocesarii vector ului din figur a 2.1. Sub diagonala pr inci pal˘ a avem doar valori 0 deoarece algor itmul nu r eactualizeaz˘ a
ar ile date vor inf orma¸tia de pe p ozi¸tiile (i, j) pentru care i > j, pr esupunˆ andu-se c˘ a ˆıntr e b˘
r es pecta aceasta condi¸tie nat ur ala. ˘
˘
Capitolul 2. Range Minimum Quer y
2.3
7
i/j 0
1
2
3
4
5
6
7
8
9
0
0
1
1
3
3
5
5
7
7
7
1
0
1
1
3
3
5
5
7
7
7
2
0
0
2
3
3
5
5
7
7
7
3
0
0
0
3
3
5
5
7
7
7
4
0
0
0
0
4
5
5
7
7
7
5
0
0
0
0
0
5
5
7
7
7
6
0
0
0
0
0
0
6
7
7
7
7
0
0
0
0
0
0
0
7
7
7
8
0
0
0
0
0
0
0
0
8
8
9
0
0
0
0
0
0
0
0
0
9
tie hO(n2), O(1)i Solu¸
Putem optimiza etapa de preprocesare a metodei anter ioar e utilizand tehnica pr ogr amar ii dinamice. La constr uc¸tia matricii, pentru fiecare p ozi¸tie (i, j) nu vom mai parcurge subvect or ul A[i, j ], ci vom putea act ualiza valoarea ın tim p constant utilizand ur mat oar ea r ecur en¸ta: ˆ
ˆ
ˆ
i, daca i = j 1], daca i < j si A[C [i][ j − 1]] ≤ A [j ] j, daca i < j si A[C [i][ j − 1]] > A [j ] ˘
C [i][ j ] =
C [i][ j −
˘
˘
Aceast˘ a r ecur en¸t˘ a se bazeaz˘ a pe f aptul c˘ a avand calculat ˘ a pozi¸tia minimului pe inter -
valul (i, j − 1), putem calcula f oar te u¸sor p ozi¸tia minimului pe inter valul (i, j) al vector ului A: este p ozi¸tia valorii minime dintr e minimul pe inter valul (i, j − 1) ¸si valoarea A [j ]. Vom putea a¸sadar actualiza fiecare celul˘ a a matricii ˆın tim p constant ¸si vom avea pentru aceast˘ a etap˘ a com plexitat ea tim p O(n2 ).
Algor itmul 2.2: Preprocesarea vector ului A (solu¸tie hO(n2 ), O(1)i) Preprocess(A, C, n ) b egi n for i ←− 0 to n − 1 do C[i][ j ] = i; for j ←− i + 1 to n − 1 do if A[C [i][ j − 1]] ≤ A [j ] then C[i][ j ] = C[i][ j − 1]; else C[i][ j ] = j ;
Capitolul 2. Range Minimum Quer y
2.4
8
√
tie hO(n), O( n)i Solu¸
ar ¸tim vector ul A ˆın O idee inter esant˘ ım p˘ a este sa ˘ˆ un vector V [ ] de lungime O( al i-lea segment de lungime un exem plu:
√
√
√
n segmente. Vom r e¸tine ˆın memor ie
n) ˆın care, pe p ozi¸tia i, vom p˘ astr a p ozi¸tia minimului din
am mai jos n al vect or ului A. Pentru a fi mai clari, pr ezent˘
Figura 2.2: ˆIm p˘ ar ¸tir ea vector ului A ˆın segmente de lungime
Pr e pr oc esar e: Se constr uie¸ste vector ul V descris mai sus: V [i] = p ozi¸tia minimului din subvect or ul A[i ·
√
n, (i + 1) ·
√
n
√
n − 1]
Constr uc¸tia lui V se poate face pr intr -o singur ˘ a parcurgere com plet˘ a a vector ului A, deci vom avea com plexitat ea O(n) pentru etapa de preprocesare. √
Algor itmul 2.3: Preprocesarea vector ului A (solu¸tie hO(n), O( n)i) Preprocess(A, V, n ) b egi n √ S = ⌊ n⌋ ; i = 0; while i < n − 1 do Min = A[i]; PosMin = i; for j ←− i + 1 to i + S − 1 do if A [j ] ≤ M in then Min = A[ j ]; PosMin = j ; V[i/S ] = Min; i = i + S;
as puns: Pentru a raspunde la un query RM QA (i, j) vom proceda astf el: R ˘ - Vom afla, utilizand vector ul V , p ozi¸tia minimului din segmentele de lungime
√
n care sunt incluse com plet ıntr e p ozi¸tiile i ¸si j. Pentru parcurgerea acestor segmente √ ¸si ob¸tiner ea pozi¸tiei minimului vom face cel mult n + 1 pa¸si (ın cazul cel mai nefavorabil i = 0, j = n − 1 ¸si vom parcurge ıntr egul vect or V ). ˆ
ˆ
ˆ
- Vom parcurge toate elementele din vect or ul A de la p ozi¸tia i pan˘ a la ˆınce putul primului segment inclus com plet ˆın inter valul [i, j ] ¸si vom r e¸tine p ozi¸tia minimulului
dintr e ele. Vom face maximum
√
n − 1 pa¸si.
Capitolul 2. Range Minimum Quer y
9
- Vom parcurge toate elementele din vector ul A de la sf ar ¸situl ultimului segment inclus com plet ˆın [i, j ] pan˘ a la p ozi¸tia j ¸si vom r e¸tine p ozi¸tia minimulului dintr e ele. Ca ¸si √
n − 1 pa¸si.
mai sus, vom face maximum
- Vom compara valorile din vector ul A de pe cele trei p ozi¸tii ob¸tinute, iar r ˘ as punsul la query va fi p ozi¸tia minimului dintr e ele. √
Vom avea ˆın total maximum 3 n − 1 pa¸si. Deci com plexitatea tim p pentru etapa de √
raspuns va fi O( n). Pe exemplul de mai sus, pentru a ob¸tine RM QA (1, 6), vom compara A[1] = 6, A[2] = 8, A[V [1]] = 2 ¸si A[6] = 9 ¸si vom r e¸tine p ozi¸tia pe care se afla ın vect or ul A minimul ˘ ˆ ase¸ste ˆın inter ior ul inter valului [3, 5], deci a minimul se g˘ dintr e aceste valori. Observam c˘ p ozi¸tia cautat ˘ a este V [1] = 5.
tie hO(nlog(n), O(1)i Solu¸
2.5
O alt˘ a abordare ar fi s˘ a preprocesam vector ul A re¸tinand pozi¸tiile minimelor pe subvect or i de lungimi 2i , i ∈ {0, 1, 2 . . .}. Vom stoca o matrice C de dimensiuni n × log(n) ˆın care ˆın celula (i, j) vom pastra p ozi¸tia minimului din subvector ul ce ˆınce p e pe p ozi¸tia i ¸si
am mai jos un exem plu: are lungime 2 j . Pentru a fi mai clari, pr ezent˘
Figura 2.3: Subvector i de lungimi 2i pentru p ozi¸tia 1 a vector ului A ˆ
Pr e pr oc esar e: In aceasta etapa vom constr ui matricea C s pecificat a mai sus. Am putea pentru fiecare pozi¸tie (i, j) din matrice sa parcurgem subvector ul din A ce ınce pe pe p ozi¸tia i ¸si are lungime 2 j ¸si sa init ializam celula cu p ozi¸tia minimului pe acest subvector, ınsa cu aceasta metoda avem com plexitat ea tim p O(n2 log(n)). Putem folosi tehnica pr ogr amar ii dinamice ¸si ob¸tine o com plexitate mai bun a. Metoda se bazeaza p e obser va¸tia ca pentru a calcula minimul pe un inter val de lungime 2 j , am putea sa ım par ¸tim inter valul ın doua, sa aflam minimul pe cele doua jumat ¸ti, sa le comparam ¸si sa r e¸tinem valoar ea ˘
˘
˘
˘
ˆ
˘
ˆ
˘
˘
˘
˘
˘
˘
˘
˘ˆ
ˆ
˘
mai mica.
˘
˘
˘
˘
˘
Aceste jumat ¸ti au lungimile 2 j −1 , deci ¸si pentru ele putem aplica aceea¸si
metod˘ a de calcul al minimului. Ne putem opri la calculul minimului pe un subvector de lungime 1 ce se poate ob¸tine ˆın tim p const ant. Revenind la calculul matricii C, vom acualiza ˆınt ai p ozi¸tiile minimelor pentru subvec-
tor i de lungime 1. Pe baza lor, vom putea afla ın tim p constant p ozi¸tiile minimelor p entr u subvector i de lungime 2, apoi pentru subvect or i de lungime 4 s.a.m.d. Com plexitat ea va fi O(nlog(n)) pentru ca fiecare element al matricii poate fi calculat ın tim p constant . ˆ
˘
ˆ
Capitolul 2. Range Minimum Quer y
10
O b¸tinem ur matoar ea r ecur en¸t˘ a pentru calculul matricii C : C [i][0] = A ([i] C [i][ j ] =
C [i][ j − 1], dac˘ a A[C [i][ j − 1]] ≤ A[C [i + 2 j −1 ][ j − 1]] C [i + 2 j −1 ][ j − 1], altf el
Pr ezentam ın continuar e pseudocodul f unc¸tiei ce calculeaza matricea C utilizand r ecur en¸ta ˆ
˘
de mai sus.
Algor itmul 2.4: Preprocesarea vector ului A (solu¸tie hO(nlog(n)), O(1)i) Preprocess(A, C, n ) b egi n for i ←− 0 to n − 1 do C[i][0] = A[i];
for j ←− 0 to ⌊log2 (n)⌋ do if i + 2 j < n − 1 then if A[C [i][ j − 1]] ≤ A[C [i + 2 j 1 ][ j − 1]] then C[i][ j ] = C[i][ j − 1]; else C[i][ j ] = C[i + 2 j 1 ][ j − 1]; −
−
Este de remarcat ca algor itmul nu va ini¸tializa toate elementele matricii, ci doar ˘
a pr opr ietat ea i + 2 j − 1 < n. Pr ezentam mai jos tr ans pusa p ozi¸tiile (i, j) care r es p ect˘ matricii C asociat ˘ a vector ului din figura 2.3. Elementele neini¸tializate sunt marcate cu valoarea −1. j/i
0
1
2
3
4
5
6
7
8
9
0
0
1
2
3
4
5
6
7
8
9
1
1
1
3
3
5
5
7
7
8
-1
2
3
3
5
5
7
7
7
-1
-1
-1
3
7
7
7
-1
-1
-1
-1
-1
-1
-1
as puns: Pentru a afla pozi¸tia minimului pe un inter val (i, j) avand calculat a maR ˘ tr icea de mai sus, am putea sa alegem doua inter vale incluse ın inter valul (i, j) cu lungimi puter i ale lui 2 care sa acopere ın totalitate inter valul (i, j), sa com par am minimele de p e cele doua inter vale ¸si sa r e¸tinem ca rezultat p ozi¸tia valorii minime dintr e acestea. Putem alege cele doua inter vale astf el: ˘
˘
˘
˘
˘
ˆ
ˆ
˘
˘
˘
˘
- Calculam cea mai apr opiat˘ a puter e a lui 2 mai mic˘ a sau egal˘ a cu lungimea inter valului (i, j). Notam aceast˘ a valoare cu len. Fie k = [log( j − i + 1)]. Atunci len = 2k . - Primul inter val va fi (i, i + len − 1) - Al doilea inter val va fi (j − len + 1, j )
Capitolul 2. Range Minimum Quer y
11
Ambele inter vale au lungimea len. Inter sec¸tia lor va fi ˆıntotdeauna nevid˘ a, iar at unci cand lungimea subvect or ului pe care se cere calculat minimul este o puter e a lui 2, cele
dou˘ astr at e a inter vale vor coincide chiar. Pozi¸tiile minimelor pe cele dou˘ a inter vale sunt p˘ ın matricea C calculat ˘ a ˆın etapa de preprocesare deoarece au lungimi puter i ale lui 2.
ˆ
Vom avea urmatoarea f ormul˘ a pentru calculul p ozi¸tiei minimului pe inter valul (i, j ):
( RM QA (i, j) =
[ − 2k + 1][k]] C [i][k ], dac˘ a A[C [i][k ]] ≤ A[C j [ − 2k + 1][k], altf el C j
Observam c˘ a la fiecare query folosim valoarea k = [log( j − i + 1)]. O p er a¸tia de logar it mar e este costisitoar e ¸si pentru a evita calculul logar it mului la fiecare query am astr a ˆın memorie un vect or Log[ ] putea include acest pas ˆın etapa de preprocesare. Vom p˘ de dimensine n, Log[i] = [log2 (i)], 1 ≤ i ≤ n. Pr ezent am mai jos pseudocodul unei f unc¸tii care calculeaz˘ a acest vector ˆın tim p liniar .
Algor itmul 2.5: Calculul vector ului Log Pr e pr oc essLog(Log, n) b egi n Log[1] = 0; for i ←− 2 to n do Log[i] = Log[i/2]+1;
Avand calculat acest vector , vom putea deter mina inter valele (i, i + len − 1) si (j − len + 1, j ) ˆın tim p const ant . Deci com plexitat ea tim p a r ˘ as pun sului va fi O(1).
E xe m p lu: Pe vector ul pr ezentat ın figura 2.3 vom calcula RM QA (1, 6) astf el: ˆ
- Avem lungimea inter valului 6, iar k = [log2 (6)] = 2 si len = 22 = 4 - Cele dou˘ a inter vale sunt (1,4) ¸si (3,6) - Comparam minimele pe cele dou˘ a inter vale: A[C [1][2]] = 5 ¸si A[C [3][2]] = 2. Valoarea cautat ˘ C a este pozi¸tia ˆın vector ul A a valorii minime dintr e acestea, adic˘ a [3][2] = 5.
2.6
RMQ 2-Dimensiona l
a astf el: fiind dat ˘ a o matr ice Problema RMQ 2-Dimensional (2D-RMQ) este definit˘ B[ ][ ] de dimensiune n × n de elemente dint r -o mul¸time total or donat ˘ a (cu r ela¸tia de ordine ”≤”), 2D − RM QB (i, j, l, L) r etur neaz˘ a perechea indicilor celui mai mic element din submatricea cu col¸tul stanga-sus ˆın (i, j) ¸si col¸tul din dr eapt a- jos ˆın (i + l − 1, j + L − 1). Dac˘ a valoarea minim˘ a apare de mai multe ori ˆın submatricea p r ecizat˘ a mai sus, atunci se va returna prima p ozi¸tie pe care apare aceasta. Este o extinder e ˆın plan a problemei R MQ sim pl˘ a pr ezentat˘ a ˆın sec¸tiunile pr ecedente, ˆın sensul c˘ a vector ul pe care se fac quer y-ur ile este extins la o matrice, iar query-urile se extind de la inter vale la dr e pt unghiur i.
Capitolul 2. Range Minimum Quer y
12
Vom pr ezent a o solu¸tie bazat˘ a tot pe ideea f olosit˘ a la solu¸tia hO(nlog(n)), O(1)i a problemei RMQ clasica. Vom r e¸tine ˆın memorie o matrice C de dimensiune n × n × log(n) × log(n): C [i][ j ][k ][ p] = p ozi¸tia (care de aceast˘ a dat ˘ a va fi o pereche de indici) pe care se afl˘ a minimul din submatricea cu col¸tul stˆ anga-sus ˆın (i, j) ¸si laturile 2k si 2 p pentr u 0 ≤ i < n, 0 ≤ j < n, 0 ≤ k ≤ [log(n)], 0 ≤ p ≤ [log(n)], i + 2k − 1 < n, j + 2 p − 1 < n . Vom folosi deci O(n2 log(n)) memorie supliment ar a. Dac˘ a la problema RMQ clasic˘ a ım par ¸team inter valul dat ˆın doua vale cu lungimile puter i ale lui 2 ¸si com par am ˘ sub inter
ˆ
minimele pe aceste inter vale, este natural ca la problema 2D-RMQ s˘ a ˆım par ¸tim dr e pt-
unghiul dat ın 4 subd r e ptunghiur i cu lungimile laturilor pu ter i ale lui 2, sa com par am minimele pe aceste dr e pt unghiur i ¸si sa r e¸tinem ca rezultat p ozi¸tia valorii minime dintr e acestea. ˆ
˘
˘
˘
ˆ
Pr e pr oc esar e: In aceasta etapa vom constr ui matricea C men¸tionat a mai sus astf el: ˘
˘
˘
- Ini¸tializam C [i][ j ][0][0] = B [i][ j ], 0 ≤ i < n, 0 ≤ j < n - Pentru fiecare linie i, vom calcula C [i][ j ][0][ p] ut ilizˆ and tehnica de la RMQ sim plu, 0 ≤ j < n, 0 ≤ p ≤ [log(n)], j + 2 p − 1 ≤ n. Practic calcul˘ am valoarea minim˘ a
pentru dr e ptunghiur i cu ınal¸timea de o unitate ¸si baza 2 p ¸si de aceea putem aplica RMQ sim plu. ˆ
˘
- Pentru fiecare coloan˘ a j, vom calcula C [i][ j ][k ][0] utilizˆ and tehnica de la RMQ simk plu, 0 ≤ i < n, 0 ≤ k ≤ [log(n)], i + 2 − 1 < n. ˆIn acest caz calculam valor ile minime pentru un dr e ptunghi cu baza de o unitate ¸si ˆın˘ al¸timea 2k ¸si de aceea putem aplica RMQ sim plu. - Calculam C [i][ j ][k ][ p] pentru k ≥ 1 ¸si p ≥ 1 folosind datele deja calculate p entr u dr e ptunghiur i de dimensiuni mai mici. Pe p ozi¸tia (i, j, k, p) r e¸tinem p ozi¸tia minimului din submatricea cu col¸tul din stˆ anga- jos ˆın (i, j) ¸si col¸tul din dr eapta- jos ˆın
(i + 2k − 1, j + 2 p − 1). Aceasta submatrice se poate ım par ¸ti ın alte 4 submat r ici mai mici. Vom pr ezent a mai jos aceste matrici prin col¸tul din stanga-sus ¸si cel dn dr eapta- jos: ˆ
ˆ
ˆ
- (i, j) si (i + 2k −1 − 1, j + 2 p−1 − 1) - (i, j + 2 p−1 − 1) si (i + 2k −1 − 1, j + 2 p − 1) - (i + 2k −1 , j) si (i + 2k − 1, j + 2k −1 − 1) - (i + 2k −1 , j + 2 p−1 ) si (i + 2k − 1, j + 2 p − 1)
Pentru aceste submatrici avem deja calculate ¸si stocate ın matricea C pozi¸tiile minimelor. Aceste p ozi¸tii pot fi r egasite ın C [i][ j ][k − 1][p − 1], C [i][ j + 2 p−1 ][k − 1][p − 1], C [i + 2k −1 ][ j ][k − 1][p − 1], C [i + 2k −1 ][ j + 2 p−1 ][k − 1][p − 1]. Com par am valor ile ˆ
˘
ˆ
˘
Capitolul 2. Range Minimum Quer y
13
din matricea B de la p ozi¸tiile men¸tionat e mai sus ¸si avem f ormula: C [i][ j ][k − 1][p − 1], dac˘ a B[C [i][ j ][k − 1][p − 1]] este minim˘ a k −1 C [i + 2 ][ j ][k − 1][p − 1],
dac˘ a B[C [i + 2k −1 ][ j ][k − 1][p − 1]] este minim
C [i][ j ][k ][ p] =
C [i][ j + 2 p−1 ][k − 1][p − 1], dac˘ a B[C [i][ j + 2 p−1 ][k − 1][p − 1]] este minim˘ a C [i + 2k −1 ][ j + 2 p−1 ][k − 1][p − 1], dac˘ a B[C [i + 2k −1 ][ j + 2 p−1 ][k − 1][p − 1]] minim
a ˆın matricea C pastr am perechi de indici ¸si de aceea am f olosit mai sus R eamintim c˘
nota¸tia B[C [i][ j ][k ][ p]] pentru valoarea din matricea B de pe pozi¸tia r e¸tinuta ın mat r icea C la p ozi¸tia (i, j, k, p). Tot ın aceasta et apa vom calcula vector ul Log de dimensiune n, Log[i] = log2 (i), ˘ ˆ
ˆ
˘
˘
1 ≤ i ≤ n. Am explicat ˆın sec¸tiunea pr ecedent˘ a cum putem calcula acest vector ˆın tim p liniar. Com plexitatea tim p total˘ a a preprocesarii va fi O(n2 log(n)), deoarece matricea C are dimensiunea n × n × log(n) × log(n) ¸si fiecare element al acesteia se poate calcula ˆın tim p constant.
as puns: Pentru a raspunde la un query de ti pul 2D R ˘
−
RM QB (i, j, l, L) vom nota
lk = Log[l] si Lk = Log[L]. Fixa e ptunghiur i incluse ˆın dr e ptunghiul dat, a car or ˘m 4 dr reuniune ˆıl acop er ˘ a com plet ¸si avand lungimi ale laturilor pu ter i ale lui 2. Pentru aceste dr e ptunghiur i avem calculate p ozi¸tiile minimelelor din etapa de preprocesare, com par am aceste minime ¸si r e¸tinem ca rezultat p ozi¸tia pe care se afl˘ a valoarea mai mica. Definim cele 4 dr e ptunghiur i prin col¸tul din st anga-sus, fiecare avand laturile 2lk si 2Lk :
(i, j), (i, j + L
−
2Lk ), (i + l − 2lk , j), (i + l − 2lk , j + L − 2Lk ).
Vom ob¸tine deci: C [i][ j ][lk ][Lk ], dac˘ a B[C [i][ j ][l k ][Lk ]] este minim˘ a k L C [i][ j + L − 2 ][lk][Lk], 2D −R M QB (i, j, l, L) =
dac˘ a B[C [i][ j + L − 2Lk ][lk][Lk]] este minim C [i + l − 2lk ][ j ][lk ][Lk ],
a B[C [i + l − 2lk ][ j ][lk ][Lk ]] este minim˘ a dac˘ C [i + l − 2lk ][ j + L − 2Lk ][lk][Lk], dac˘ a B[C [i + l − 2lk ][ j + L − 2Lk ][lk][Lk]] minim
E xe m plu: Fie matricea B definita ca mai jos: ˘
i/j
0
1
2
3
4
5
0
1
9
4
3
7
11
1
2
6
5
13
9
3
2
2
2
8
4
12
5
3
11
4
6
3
9
2
4
10
9
6
4
1
3
5
2
3
5
3
7
2
Capitolul 2. Range Minimum Quer y
14
Calculam 2D − RM Q B (1, 1, 3, 5). Dr e pt unghiul pe care ni se cere p ozi¸tia minimului are lungimile laturilor 3 si 5, deci vom avea laturile celor 4 ”s ubd r e ptunghiur i” de 2 ¸si 4. Acestea sunt precizate mai jos prin col¸tul din st anga-sus ¸si cel din dr eapt a- jos:
- (1,1) si (2,4) - avem minimul 2 pe p ozi¸tia (2,1) - (1,2) si (2,5) - avem minimul 3 pe p ozi¸tia (1,5) - (2,1) si (3,4) - avem minimul 2 pe p ozi¸tia (2,1) - (2,2) si (3,5) - avem minimul 2 pe p ozi¸tia (3,5)
Comparand valorile minime din cele 4 dr e ptunghiur i, obser v˘ am ca ˘ 2 est e cea mai mica ˘ valoare. Vom alege ca rezultat pentru acest query p ozi¸tia (2,1), dat fiind f apt ul c˘ a aceasta este prima p ozi¸tie din dr e pt unghi pe care apare valoarea minim˘ a.
Arbori de inter vale
2.7
Un arbore de inter vale est e un arbore binar ˆın care fiecarui nod ˆıi putem asocia anumite inf orma¸tii. Este o str uctur ˘ a de date similar ˘ a unui heap care p er mite atˆat actualizar ea, cat s¸i inter ogar ea inf orma¸tiilor din noduri. Pentru un inter val [i, j ] se poate defini r ecur siv astf el:
- Primul nod va pastra inf orma¸tia pentru inter valul [i, j ] - Dac˘ a i < j, fiul stang va r e¸tine inf orma¸tia pentru inter valul [i, (i + j )/2], iar fiul
drept pentru inter valul [(i + j )/2 + 1, j ] Am putea folosi arbori de inter vale pentru a rezolva problema RMQ pastrand ˆın nodurile arborelui p ozi¸tia minimului pe inter valele asociate. Ne inter eseaz˘ a ˆın s pecial constr uc¸tia arborelui ¸si modul de inter ogar e, ˆıns˘ a vom pr ezenta mai jos ¸si actualizar ea ar borelui pentru a sublinia flexi bilitatea acestei structuri de date, super ioar ˘ ar ˘ a f ˘ a ˆındoial˘ a, metodelor pr ezentat e anter ior .
Pr opr iet ¸ti ale arborilor de inter vale: - Pentru un vect or de lungime n, arborele de inter vale va avea n noduri f r unz˘ a ce corespund unor inter vale de lungime 1. - Pentru un vect or de lungime n, arborele de inter vale constr uit va avea 2n − 1 nodur i - Un arbore de inter vale este un arbore binar bine echilibrat (dif er en¸ta absolut˘ a ˆıntr e ınal¸timea subarborelui st ang ¸si cea a subarborelui drept este cel mult 1). A¸sadar ,
ˆ
ˆ
pentru un arbore ce r e¸tine m inter vale, ınal¸timea sa va fi [log2 (m)]. In cazul nostr u, vom avea 2n − 1 noduri, deci ınal¸timea arborelui va fi [log2 (2n − 1)] ∈ O(log(n)) ˆ
˘
ˆ
Vom pr ezent a mai jos un vect or de dimensiune 10 ¸si arborele de inter vale asociat . Fiecare nod al arborelui desenat are specificate dou˘ a inf orma¸tii: inter valul cor es punzator nodului (ˆın dreapta nodului) ¸si p ozi¸tia minimului pentru acel inter val (ˆın inter ior ul nodului).
Capitolul 2. Range Minimum Quer y
15
Figura 2.4: Arborele de inter vale pentru un vector de dimensiune 10
Constr uc¸tia arborelui de inter vale
2.7.1
r unz˘ Vom constr ui un arbore de inter vale recursiv pleca a spre r adacin ˆnd de la nodurile f astf el: - O f r unz˘ a a arborelui corespunde unui inter val de lungime 1, deci valoarea p entr u aceste tipuri de noduri poate fi ini¸tializat˘ a cu p ozi¸tia cor es punzatoar e inter valului - Pentru un nod inter ior , com par ˘ am valorile din vector ul A de pe p ozi¸tiile stocate ˆın fiul st ang ¸si fiul drept ¸si ini¸tializam inf orma¸tia din nod cu p ozi¸tia pe care se afla minimul Ca im plement ar e, un arbore de inter vale este f oar te aseman˘ at or unui heap. Vom r e¸tine un vect or T r ee[ ] de dimensiune 2[log(n)+2] pe care ˆıl vom const r ui astf el: - Pe p ozi¸tia 1 vom r e¸tine inf orma¸tia pentru radacina ar b or elui - Dac˘ a pe pozi¸tia x din vector ul T ree avem stocat˘ a inf orma¸tia pentru un nod u, pe
p ozi¸tia 2x vom r e¸tine inf orma¸tia pentru fiul stang al lui u, iar pe p ozi¸tia 2x + 1 inf orma¸tia pentru fiul dr e pt
Pr ezentam mai jos o f unc¸tie r ecur siva ce constr uie¸ste arborele de inter vale pentru un vect or . Remarcam ca fiecare nod al arborelui este parcurs o singur a dat a, deci com plexitatea tim p pentru constr uc¸tia arborelui va fi O(n). ˘
˘
˘
˘
Capitolul 2. Range Minimum Quer y
16
Algor itmul 2.6: Constr uc¸tia unui arbore de inter vale. Func¸tia va fi apelat a cu par ametr ii nod = 1 (nodul cur ent), lef t = 0, r ig ht = n − 1 (inter valul cur ent). ˘
BuildSegme ntTr ee( Tr ee, nod, lef t, r ight ) b egi n if lef t = r ig ht then Tree[nod] = lef t; else m = (lef t+r ight)/2; BuildSegment Tr ee(Tr ee, 2·nod, st, m); BuildSegment Tr ee(Tr ee, 2· nod+1, m+1, r ight); if A[T r ee[2 · nod]] ≤ A[T r ee[2 · nod + 1]] then Tree[nod] = Tr ee[2· nod]; else Tree[nod] = Tr ee[2· nod+1];
2.7.2
Actualizarea arborelui de inter vale
Dac˘ a ˆın vector ul A se schim b˘ a valoarea unui element, putem modifica arborele de inter vale astf el ˆıncat s˘ a cor es pund˘ a noului vector A, nefiind nevoie s˘ a ˆıl r econstr uim com-
a se modific˘ a valoarea unui element x al vector ului A, va tr e bui s˘ a plet. Presupunand c˘ modificam toate nodurile arborelui care stocheaz˘ a inf orma¸tia cor es punzatoar e unui in-
ter val ce con¸tine elementul x. Func¸tia ce va actualiza arborele este ¸si de aceasta data r ecur siva: ˘
˘
- Inf orma¸tia din nodul f r unz˘ a ce corespunde elementului x din vector va r amane
neschim bat˘ a - Pentru un nod inter n u c˘ ar uia i se asociaz˘ a un inter val ce con¸tine elementul x, vom act ualiza ˆıntai inf orma¸tiile din cei doi fii: dac˘ a elementul x este inclus ˆın inter valul cor es punzat or fiului stang, vom continua actualizar ea ˆın subarborele stang, altf el
vom actualiza subarborele dr e pt; dup˘ a actualizar ea acestor a, comparam valorile din
am vect or ul A de pe p ozi¸tiile stocate ˆın fiul st ang ¸si fiul drept ai lui u ¸si ini¸tializ˘ inf orma¸tia cor es punzatoar e lui u cu p ozi¸tia din vector ul A pe care se afl˘ a minimul.
Com plexitat ea tim p a actualizar ii arborelui este O(log(n)). Observam c˘ a f unc¸tia de actualizar e parcurge lan¸tul arborelui care are ca extr emit ¸ti radacina ¸si nodul f r unz cor es pun zat or inter valului de lungime 1 care include element ul x. Dup˘ a cum am pr ecizat
ın partea de descriere a arborelui, ˆınal¸timea acestuia este [log(2n − 1)], deci com plexitatea tim p a actualizar ii va fi O(log(n)).
ˆ
Arborii de inter vale p er mit ¸si act ualizar ea unui inter val, ˆınsa ˆın aceast˘ a lucrare vom
pr ezenta doar acest caz par ticular de actualizar e, deoarece of er ˘ a o solu¸tie pentru pr oblema RMQ dinamic˘ a (ˆın aceast˘ a versiune a problemei sunt permise ¸si modificari ale secven¸tei de numer e).
Capitolul 2. Range Minimum Quer y
17
Algor itmul 2.7: Actualizar ea unui arbore de inter vale. Func¸tia va fi apelat a cu par ametr ii nod = 1, lef t = 0, r ig ht = n − 1, val = noua valoare a elementului x b or e. din ar ˘
U pd at eSegment Tr ee( Tr ee, nod, lef t, r ight, x, val) b egi n if lef t = r ig ht then Tree[nod] = lef t; else m = (lef t+r ight)/2; if x ≤ m then U pd ateSegmentTr ee(Tr ee, 2·nod, st, m, x, val); else U pd ateSegmentTr ee(Tr ee, 2· nod+1, m+1, r ight, x, val);
if A[T r ee[2 · nod]] ≤ A[T r ee[2 · nod + 1]] then Tree[nod] = Tr ee[2· nod]; else Tree[nod] = Tr ee[2· nod+1];
2.7.3
Inter ogar ea arborelui de inter vale
Pentru aflarea minimului pe un inter val [a, b] al vector ului A, acesta va fi ım par ¸tit ın inter vale mai mici pentru care avem stocat a ın arbore p ozi¸tia minimului. Vom par cur ge arborele plecand din radacina p ana ajungem la nodurile cor es pun zatoar e acestor inter vale, vom compara valorile din vect or ul A de pe p ozi¸tiile stocate ın aceste noduri ¸si vom r e¸tine ca rezultat p ozi¸tia minimului dint r e acestea. Pr ezent am ın continuar e o f unc¸tie r ecur siva care va primi ca par amet r ii extr emit a¸tile inter valului pe care se dor e¸ste aflarea p ozi¸tiei minimul ¸si r etur neaza aceasta p ozi¸tie. Pentru fiecare nod, va executa ur mator ii pa¸si: ˆ
˘
ˆ
˘ ˆ
˘
ˆ
˘
ˆ
˘
˘
˘
˘
- Dac˘ a inter valul cor es punza ent est e inclus ˆın inter valul [a, b], atunci ˘t or nodului cu r
r etur nam inf orma¸tia din nod - Altf el: - verificam dac˘ a inter valul cor es punzator nodului stˆ ang se inter secteaz˘ a cu [a, b]; ın caz afirmativ apelam f unc¸tia pentru nodul stˆ ang
ˆ
- verificam dac˘ a inter valul cor es punzator nodului drept se inter secteaz˘ a cu [a, b]; ın caz afirmativ apelam f unc¸tia pentru nodul dr e pt
ˆ
- comparam valorile din vect or ul A de pe p ozi¸tiile returnate de f unc¸tiile apelate
pentru fiii nodului cur ent ¸si r etur nam pozi¸tia pe care se gase¸ste minimul dintr e acestea ˘
ealizeaz˘ Observam ca a o parcurgere com plet˘ a a arborelui. Este posibil ca la ˘ nu se r
un moment dat s˘ at ¸si pentru cel drept, ˆıns˘ a aiba loc un apel atˆat pentru fiul stˆ ang, cˆ a
b or i, acest lucru se va ˆıntam pla o singur ˘ a data. De¸si parcurgerea continu˘ a pe ambii subar ın subarborele stang fiul drept al r ad˘ acinii va fi inclus com plet ˆın inter valul [a, b], iar
ˆ
ın subarborele drept fiul stang al r ad˘ ¸ i pe acinii va fi inclus com plet ˆın inter valul dat. S
ˆ
Capitolul 2. Range Minimum Quer y
18
a”, a. Deci, de la aceast˘ a ”ru pere ˆın dou˘ nivelurile ur matoar e vom avea o situa¸tie similar ˘
ın fiecare subarbore parcurgerea va continua pe un singur lan¸t ¸si se va opri la un nod al carui inter val corespunzator este inclus ˆın [a, b]. Com plexitat ea inter og˘ ar ii va de pinde ˆ a¸sadar de ˆınal¸timea arborelui. In partea de descriere a arborilor de inter vale am pr ecizat c˘ a ˆınal¸timea arborelui este [log(2n − 1)] + 1 , deci vom avea com plexitatea tim p O(log(n)).
ˆ
Algor itmul 2.8: Inter ogar ea unui arbore de inter vale. Func¸tia va fi apelata cu par ametr ii nod = 1, lef t = 0, r ig ht = n − 1, a si b (extr emit ¸tile inter valului p e care se solicita p ozi¸tia minimului) ˘
˘
Quer ySegment Tr ee( Tr ee, nod, lef t, r ight, a, b) b egi n if a ≤ lef t and r ig ht ≤ b then return Tree[nod]; else m = (lef t+r ight)/2; PosMin = −1; if a ≤ m then PosMin = Quer ySegment Tr ee(Tr ee, 2·nod, lef t, m, a, b );
if b ≥ m + 1 then Aux = Quer ySegmentTr ee(Tr ee, 2· nod+1, m+1, r ight, a, b); if P osM in = −1 or A[P osM in] ≥ A[Aux] th en PosMin = Aux;
return PosMin;
Observam c˘ a folosind arbori de inter vale pentru rezolvarea problemei RMQ, vom avea com plexitat ea tim p t otal˘ a hO(n), O(log(n))i.
2.8
Un caz particular de RMQ: RMQ ± 1
Problema RM Q ± 1A se define¸ste similar problemei RM QA , ˆıns˘ a vector ul A tr e buie sa es p ecte o condi¸tie ˆın plus: ˘ r
|A[i] − A[i + 1]| = 1, 0 ≤ i < n
− 1
Cu alte cuvinte, dif er en¸ta ˆın modul ˆıntr e oricare dou˘ a elemente consecutive tr e buie s˘ a fie de exact o unitate. Ne propunem s˘ a rezolvam aceast˘ a pr oblem˘ a ˆın com plexitatea tim p hO(n), O(1)i.
Vom ˆım par ¸ti vect or ul A ˆın mai multe blocuri de lungime len =
[log(n)]
. Vom mai past r a
ın memorie doi vect or i ¸si o matr ice:
ˆ
- M de dimensiune
n len
ın care pe p ozi¸tia i vom pastra minimul din al i-lea bloc al
ˆ
a f oar te simplu ˆın tim p liniar . vect or ului A. Constr uc¸tia acest ui vect or se r ealizeaz˘ - B de aceea¸ti dimensiune ˆın care pe p ozi¸tia i vom p˘ astr a p ozi¸tia minimului din al i-lea bloc al vect or ului A. Vom folosi acest vect or pentru a ¸sti p ozi¸tia pe care se afl˘ a minimele re¸tinute ˆın vector ul M . Putem constr ui acest vector ˆın acela¸si tim p
cu vect or ul M .
Capitolul 2. Range Minimum Quer y
- C de dimensiune
n
en
× log(
19
n
en )
Figura 2.5: Vector ii B si M asocia¸ti unui vector de lungime 16
Vom preprocesa vect or ul M aplicand o metod˘ a similara celei pr ezentate ˆın sec¸tiunea 2.5. Vom r e¸tine ˆın matricea C p ozi¸tia minimului din vect or ul A pe inter vale ce con¸tin 2i blocuri com plete, 0 ≤ i < log( lenn ). Avem deci: C [i][ j ] = p ozi¸tia minimului din vect or ul A din inter valul cu extr emitat ea stang˘ a pe prima p ozi¸tie a blocului i ¸si care acop er ˘ a 2 j blocuri com plete Avand minimele ¸si p ozi¸tiile minimelor din blocuri re¸tinute ˆın vect or ul M , r es p ectiv B ,
a matrice f oar te u¸sor utilizˆ and tehnica programarii dinamice. Avem putem constr ui aceast˘ ur matoar ea r ecur en¸ta: C [i][0] = B [i] ( C [i][ j ] =
C [i][ j − 1], dac˘ a M [C [i][ j − 1]] ≤ M [C [i + 2 j −1 ][ j − 1]] C [i + 2 j −1 ][ j − 1], dac˘ a M [C [i][ j − 1]] > M [C [i + 2 j −1 ][ j − 1]]
Aplicand aceast˘ a formula, vom ob¸tine pentru vector ul A pr ezentat ˆın figura 2.5 matr icea pr ezentat ˘ a mai jos. Observam c˘ a nu toate elementele matricii vor fi ini¸tializat e, ci doar acele p ozi¸tii (i, j) pentru care i + 2 j − 1 ≤ marcate cu valoarea −1.
n
en
. Pozi¸tiile neini¸tializat e sunt mai jos
i/j
0
1
2
3
0
0
0
0
0
1
2
5
5
-1
2
5
5
10
-1
3
6
9
10
-1
4
9
10
10
-1
5
10
10
-1
-1
6
12
12
-1
-1
7
15
-1
-1
-1
Fiecare celul˘ a a matricii C poate fi ini¸tializat˘ a ˆın tim p constant, deci pentru calculul acesteia vom avea com plexitatea tim p
n
O n ) ∈ O (n ) · log( len len
Capitolul 2. Range Minimum Quer y
20
Ef ectuand aceasta preprocesare vom putea r as punde ın tim p O(1) la inter ogar i R MQ ce solicita minimul pe un inter val ce include unul sau mai multe blocuri com plete aplicand o metoda similara metodei de r as puns pr ezentat a ın sec¸tiunea 2.5: fixam doua inter vale ˘
˘
ˆ
˘
˘
˘
˘
˘ ˆ
˘
care includ com plet 2i blocuri ¸si a caror reuniune acoper ˘ a com plet inter valul pe care se cer e p ozi¸tia minimului. Pentru aceste inter vale avem calculat ˘ a pozi¸tia minimului ˆın matr icea C. Deci pentru a raspunde la query este necesar ˘ a o sim pl˘ a com par a¸tie. Dar este posibil s˘ a avem query-uri care s˘ a nu con¸tin˘ a com plet anumite blocuri sau ˆın care inter valul pe care se solicit˘ a minimul s˘ a fie con¸tinut ˆıntr -un bloc. Vom pr ezenta ˆın continuar e o metod˘ a de a raspunde ˆın tim p O(1) ¸si la un query de ti pul RM QA (i, j) unde i ¸si j se afl˘ a ˆın inter ior ul aceluia¸si bloc. Aceast˘ a metod˘ a se bazeaz˘ a pe ur matoar ea obser va¸tie:
O bser va¸tia 2.1. Avand da¸ti doi vectori X [ ] si Y [ ] de dimensiune k ce d if er a pr int r-o valoare fi xa pe fiecare po z i ¸ti e, ad ica ∃ c astfel ıncat X [i] = Y [i] + c, 0 ≤ i ≤ k − 1 , at unci ˆ
˘
˘
˘
ˆ
ˆ
toate r a s pun sur il e pentru problema RMQ vor fi identice pentru X si Y . ˘
A¸sadar, pentru doua blocuri care dif er a pr intr -o valoare fixa pe fiecare pozi¸tie, vom avea acelea¸si raspunsuri la inter ogar ile RMQ. De exemplu blocurile 0 ¸si 1 din vect or ul A pr ezentat ın figura 2.5 dif er a cu valoarea c = 2 ¸si ıntr -adevar la orice ıntr e bar e R MQ aplicat a celor doua blocuri vom avea acela¸si r as puns. Blocurile pe care le preprocesam au o pr opr ietate ın plus: dif er en¸ta ın modul a or icar or doua valori consecutive este 1. Avand aceasta pr opr ietate, putem ”simplifica” blocur ile ˘
˘
˘
˘
ˆ
˘
˘
ˆ
ˆ
˘
ˆ
˘
ˆ
˘
astf el:
B loc [i] = B loc[i] − B loc[i + 1], 0 ′
≤
i < len
−
1
Am notat mai sus cu B loc[i] valoarea ini¸tial˘ a de pe p ozi¸tia i din bloc ¸si cu B loc [i] ′
valoarea de pe p ozi¸tia i din forma sim plificat ˘ a a acestuia.
Evident vom avea acum ın blocuri doar elemente +1 si −1. Observam ca blocur ile simplificate au lungimea cu o unitate mai mica decat blocurile ini¸tiale. O alt a obser va¸tie im p or t ant a este ca avand valoarea ini¸tiala Bloc[0] putem r econst r ui valorile ini¸tiale din ıntr egul bloc: ˆ
˘
˘
˘
˘
ˆ
B loc[i] = Bloc[0]
−
(Bloc′ [0] + Bloc′ [1] + . . . + B loc [i − 1]), 1 ≤ i < len ′
√
O bser va¸tia 2.2. E xi st a doar O( n) astfel de blocuri de lungime
[log(n )]
˘
poate avea valoarea −1 sau +1 , deci vom avea 2
[log (n)] − 2
Fiecarui bloc ˆıi vom asocia un numar ˆıntr e 0 si 2
√−
−
1. Un el ement
= O( n) astfel de bl ocur i.
[log (n)] − 2
−
1 pentru a-l putea identifica
mai u¸sor. Acest numar scris ˆın binar va fi ob¸tinut ˆınlocuind valorile −1 cu 0 ¸si +1 cu 1 din bloc. Spre exemplu, ˆın vect or ul A pr ezentat ˆın figura 2.5 avem dou˘ a tipuri de blocur i de dimensiune 2: unul ˆın care cele dou˘ a valori sunt ˆın ordine cr escatoar e ¸si unul ˆın care valorile sunt ˆın ordine descr escatoar e. Forma lor sim plificat ˘ a va avea lungimea 1 ¸si va fi a-l putem idenevident [−1] pentru primul tip (caruia i se va asocia ca numar prin care s˘
tifica 0) ¸si [+1] pentru cel de-al doilea tip (car uia ıi vom asocia ca identificat or numar ul 1). ˘
ˆ
˘
Vom constr ui acum o matrice D ˆın care pentru fiecare tip de bloc vom p˘ astr a r ˘ as punsul √ la orice query RMQ pe blocul r es p ectiv. Matricea D va avea dimensiune n × log(n) × √ log(n). Va ocupa deci O( n · log 2 (n)) ∈ O(n) memorie supliment ar a. Vom avea:
Capitolul 2. Range Minimum Quer y
21
D [i][ j ][k ] = pozi¸tia minimului pentru blocul de tip i pe inter valul j [ , k] Putem constr ui aceasta matrice folosind metoda pr ezentat a ın sec¸tiunea 2.3. Pentr u fiecare tip de bloc i (notat ın formula de mai jos cu Bloc) avem: ˘
˘ ˆ
ˆ
j,
D [i][ j ][k ] =
dac˘ a j = k
D [i][ j ][k − 1], daca B loc[D [i][ j ][k − 1]] ≤ Bloc[k] si j < k k, daca B loc[D [i][ j ][k − 1]] > Bloc[k] si j < k ˘
˘
Vom pr ezent a mai jos matricea D pentru cele dou˘ a tipuri de blocuri ale vector ului A
pr ezentat ˆın figura 2.5. j /k 0 D[0]
1
0
0
0
1
0
1
D[1] j /k 0 0 0
1
0
1
1
1
Observam c˘ a fiecare element al matricii D poate fi ini¸tializat ˆın tim p constant, deci
pentru constr uc¸tia sa vom avea com plexitat ea tim p √
O( n · log 2 (n)) ∈ O(n) Avand calculate p ozi¸tiile minimelor pentru orice inter val din inter ior ul unui bloc, putem acum raspunde ˆın tim p constant ¸si la query-uri de ti pul RM QA (i, j) unde i si j se afl˘ a ˆın inter ior ul aceluia¸si bloc. Vom mai pastra ˆın memorie un vect or T de dimensiune nen, unde len este lungimea unui bloc. ˆın acest vector vom r e¸tine pe p ozi¸tia i ti pul celui de-al i-lea bloc din vect or ul A. Constr uc¸tia acest ui vector este f oar te sim pl˘ a ¸si se poate realiza ˆın tim p liniar. Mai jos este pr ezentat vect or ul T asociat vect or ului A din figura 2.5.
Figura 2.6: Vector ii T asociat vector ului A din figura 2.5 Pr ezentam ˆın continuar e pa¸sii ¸si com plexit ¸tile tim p pentru etapele de preprocesare ¸si
raspuns la un query pentru problema RM Q ± 1A :
Etapa de pr e pr oc esar e - Se calculeaz˘ as punsului a vector ii M , B ¸si matricea C pr ezenta¸ti anter ior ¸si necesari r ˘ la un query care solicit˘ a minimul pe un inter val ce include mai multe blocuri com plete - Se calculeaz˘ asi rapid ti pul unui bloc a vector ul T pr ezentat mai sus pentru a putea g˘ din vect or ul A - Se calculeaz˘ a matricea D pr ezentat˘ a anter ior necesar ˘ a raspunsului la un query care solici ta minimul pe un inter val inclus ˆıntr -un bloc
Toate oper a¸tiile de mai sus se pot face ın tim p liniar uitlizand O(n) memorie suplimentar a. ˆ
ˆ
Capitolul 2. Range Minimum Quer y
22
as pun s Etapa de r ˘ - Pentru un query RM Q ± 1A (i, j) cu i si j incluse ˆın acela¸si bloc vom identifica ˆınt ai
ti pul blocului folosind vector ul T . Fie k acest tip. Atunci RM Q± 1A(i, j) = D[k ][i][ j ] - Pentru un query RM Q ± 1A (i, j) pentru care inter valul [i, j ] inter secteaz˘ a mai multe blocuri, vom ˆım par ¸ti inter valul ˆın alte trei inter vale de lungimi mai mici: - Primul inter val va ˆınce p e pe p ozi¸tia i ¸si se va ˆıntinde pan˘ a la ˆınce putul pr imului bloc inclus com plet ˆın inter valul [i, j ]. Este evident c˘ a acest inter val va fi
con¸tinut ıntr -un singur bloc. Vom afla ıntai ti pul blocului folosind vector ul T ¸si apoi p ozi¸tia minimului ın acest bloc utilizand matricea D. Avand p ozi¸tia minimului ın bloc se poate deter mina f oar te u¸sor p ozi¸tia minimului din vect or ul A cor es punzatoar e acest ui prim inter val. ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
- Al doilea inter val va acoperi toate blocurile incluse com plet ˆın inter valul [i, j ].
Putem afla minimul pe acest inter val ın tim p constant folosind matricea C . ˆ
- Al tr eilea inter val se va ˆıntinde de la sf ˆ ar ¸situl ultimului bloc inclus com plet ˆın inter valul [i, j ] pan˘ a la p ozi¸tia j . Este evident c˘ a acest inter val va fi con¸tinut
ıntr -un singur bloc.
ˆ
Vom afla ˆıntai ti pul blocului folosind vector ul T ¸si apoi
p ozi¸tia minimului ˆın acest bloc utilizand matricea D. Avand p ozi¸tia minimului ˆın bloc se poate deter mina f oar te u¸sor p ozi¸tia minimului din vect or ul A cor es punzatoar e acest ui inter val.
Observam ca vector ii ¸si matricile constr uite ˆın etapa de preprocesare, putem ˘ folosind afla ˆın tim p constant p ozi¸tia minimului pentru fiecare tip de inter val men¸tionat mai sus. Deci com plexitatea tim p pentru aflarea r ˘ as punsului unui query ce solicit˘ a pozi¸tia minimului pe un inter val oarecare (i, j ) este O(1).
Ca pitolul 3
Lowest Common Ancestor Fie T un arbore cu radacina r ¸si n noduri. Vom defini mai ˆıntˆ ai no¸tiunea de str ˘ amo¸s al unui nod. si v spunem ca u este st r amo s Defin i¸tia 3.1. Avand date doua noduri u ¸ ¸ al lui v daca u ˆ
˘
˘
˘
˘
se a fl a pe l an ¸t ul dintre r ad acina arborelui ¸ si nodul v. ˘
˘ ˘
Avand aceast˘ a no¸tiune definita, putem acum s˘ a descriem problema Lowest Common Ancest or (LC A) pentru o pereche de nodur i.
Defin i¸tia 3.2. Fiind date doua noduri u ¸ si v , LC AT (u, v) este cel mai ınd epar t at nod de r ad acina , st ra si pentru v . Atunci cand contextul este clar vom mo s ¸ at at pentru u , cat ¸ ˘
˘ ˘
˘
˘
ˆ
ˆ
ˆ
˘
ˆ
renun¸ta la specificarea indicelui T .
Figura 3.1: LC AT (10, 15) = 3
Putem aborda aceasta pr oblema ın doua moduri: ˘
˘ ˆ
˘
- Cunoa¸stem toate ˆıntr e b˘ ar ile LC A(u, v) al caror raspuns ne inter eseaz˘ a ˆınc˘ a de la ınce putul algor it mului ¸si constr uim algor it mul folosindu-ne de aceste inf orma¸tii ast-
ˆ
fel ˆıncat la sf ar ¸sit, algor it mul va oferi raspunsul la aceste ˆıntr e bar i, dar nu va putea
23
Capitolul 3. Lowest Common Ancestor
24
produce un raspuns ¸si la alte ˆıntr e bar i ˆın af ar ˘ a de cele specificate la ˆınce put. Acest al-
at oar e algor itmul gor it m se nume¸ste off-line. Vom pr ezenta ˆın una din sec¸tiunile ur m˘ lui Tarjan care aplic˘ a aceast˘ a tactic˘ a de rezolvare a problemei LC A.
¸ inand cont c˘ - T a arborele este static, am putea s˘ a abor d˘ a celei am o metoda ˘ similar ˘ aplicate la RM Q: sa orma¸tii ˆın str uctur i ˘ preprocesam arborele, st ocand anumit e inf de date auxiliare care ne vor ajuta s˘ a raspundem mai rapid la query-uri. Str uctur ile de date sunt inde p endente de ˆıntr e bar ile LC A, acestea nefiind cunoscute ˆınaintea preprocesarii. Dup˘ as pund˘ a preprocesare, algor itmul va putea pr actic s˘ a r ˘ a la or ice query LC A. Acest tip de algor itm se nume¸ste on-line ¸si aceasta a f ost abor dar ea
pr inci pal˘ a de-a lungul tim pului de rezolvare a problemei LC A. De aceea, ˆın continuare vom pr ezenta mai multe solu¸tii de acest ti p.
3.1
tie hO(n), O(n)i Solu¸
O solu¸tie f oar te sim pl˘ asim cel mai apropiat str ˘ a ar fi s˘ a g˘ and amo¸s comun par cur gˆ
par¸tial arborele: vom ınce pe parcurgerea din cele doua noduri ¸si vom urca pe niveluri mai apropiate de radacina prin legatur ile fiu-tat a pana ajungem la un nod comun. Pr actic vom parcurge lan¸tur ile de la cele doua noduri la cel mai apropiat str amo¸s comun. Avem doua cazur i: ˆ
˘
˘
˘
˘
˘
˘
- Cele dou˘ a noduri u ¸si v din query se afl˘ a pe acela¸si nivel. ˆIn acest caz par cur ger ea este f oar te simpla:
vom urca la fiecare pas cˆ at e un nivel pe ambele lan¸turi pˆ an˘ a
ajungem la acela¸si nod.
Evident acesta este cel mai apropiat str amo¸s comun al ˘
nodurilor u ¸si v. - Cele dou˘ a noduri v ¸si v se afl˘ a pe niveluri dif er ite. Presupunem c˘ a v se afl˘ a pe un ˆ nivel mai jos decat u. In acest caz lan¸tul de la nodul v la cel mai apropiat str amo¸s amo¸s. Vom parcurge ˆıntˆ comun este mai lung decˆ at cel de la u la nodul str ˘ ai o par te din primul lan¸t men¸tionat , pan˘ a cand vom ajunge la nodul de pe lan¸t aflat pe acela¸si nivel cu nodul u, iar apoi vom continua parcurgerea pe ambele lan¸turi pˆ an˘ a a jungem la acela¸si nod. ˆ
Pr e pr oc esar e: In aceasta etapa va tr e bui sa constr uim vector ii P ar ent[ ] ¸si Level[ ], ambii de dimensiune n. ˘
˘
˘
P ar ent[i] = tatal nodului i
Lev el[i] = nivelul pe care se afla nodul i ˘
Ace¸sti vect or i se pot costr ui f oar te u¸sor ˆın tim p liniar. Vom folosi deci O(n) memor ie suplimentar ˘ a ¸si vom avea com plexitat ea tim p O(n) pentru acest˘ a etapa.
as puns: Pr ezentam mai jos pseudocodul f unc¸tiei care pr ime¸ste ca par amentr ii cele R ˘ doua noduri pentru care dorim sa aflam cel mai apropiat str amo¸s comun ¸si r etur neaza acest st r amo¸s. ˘
˘
˘
˘
˘
Capitolul 3. Lowest Common Ancestor
25
Algor itmul 3.1: Func¸tia pentru calculul LC A(u, v )(solu¸tie hO(n), O(n)i) QueryLCA(Parent, Level, u, v) b egi n while u = v do if Level[u] > Level[v] then u = Par ent[u]; else v = Par ent[v ];
return u;
Com plexitat ea tim p a raspunsului la un query este O(n). De¸si parcurgerea ar b or elui necesar ˘ amo¸s comun este ˆın general par ¸tial˘ a pentru aflarea celui mai apropiat str ˘ a, putem avea ¸si cazuri ˆın care se va ajunge la o parcurgere total˘ a (ˆın acest caz nef avor abil
a jungandu-se la com plexitatea tim p O(n)). Pr ezentam ın figura de mai jos un astf el de caz: ˆ
ˆ
Figura 3.2: Cazul cel mai defavorabil pentru calculul LC A: LC A(6, 7) = 1
3.2
√
tie hO(n), O( n)i Solu¸
Am putea optimiza solu¸tia de mai sus pr e pr ocesˆ and arborele astf el ˆıncat la un quer y LC A s˘ a nu mai parcurgem toate nodurile de pe lan¸tur ile de la cele dou˘ a noduri la cel mai apropiat str amo¸s comun, ci s˘ a ”sarim” anumite p or ¸tiuni pentru a mic¸sor a numar ul de pa¸si. Am putea face acest lucru ˆım par ¸tind arborele ˆın mai multe sec¸tiuni ast f el ˆıncat la cˆ fiecare pas s˘ atea niveluri ate a urcam nu cu un nivel mai sus, ci cu o sec¸tiune (deci cu atˆ √ are o sec¸tiune). Vom ˆım par ¸ti ˆın continuar e arborele ˆın sec¸tiuni cu lungimea h, unde h √
este ˆınal¸timea arborelui. Deci nodurile aflate pe nivelurile de la 0 la √
prima sec¸tiune, cele aflate pe nivelurile de la
√
h − 1 se vor afla ˆın
h la 2 h − 1 se vor afla ˆın a doua sec¸tiune
b or ele ¸s.a.m.d. Pentru a fi mai clari vom pr ezenta mai jos cum va fi ım par ¸tit pe sec¸tiuni ar ˆ
˘
pr ezentat ˆın figur ˘ a 3.1. ˆInal¸timea acestuia este 5, deci o sec¸tiune va acoperi dou˘ a nivelur i, mai pu¸tin ultima care con¸tine doar un nivel.
Capitolul 3. Lowest Common Ancestor
26
Figura 3.3: ˆIm p˘ ar ¸tir ea unui arbore ˆın sec¸tiuni de lungimi
√
n
Pr e pr oc esar e: Pentru a putea parcurge la fiecare pas cate o sec¸tiune va tr e bui sa ¸stim pentru orice nod care este cel mai apropiat str amo¸s al sau aflat ın sec¸tiunea pr ecedenta (vom numi ın continuar e acest nod tatal ınde par tat). Vom r e¸tine aceast a valoare ıntr -un vect or P [ ] de dimensiune n. Pentru a-l constr ui va tr e bui ınt ai sa calculam vector ii P ar ent ¸si Level f olosi¸ti ¸si la metoda pr ezentat a anter ior . Vom constr ui acest vect or P astf el: ˆ
˘
ˆ
ˆ
˘
ˆ
˘
˘
˘
ˆ
ˆ
˘
˘
√
- Pentru nodurile aflate pe niveluri ˆıntr e 0 ¸si
h − 1, tatal ˆınde par tat va fi r ˘ adacina
- Pentru nodurile aflate pe niveluri mai mari ˆın arbore ini¸tializam vect or ul P astf el: - Dac˘ a nodul (pe care ˆıl notam cu√x) se afl˘ a pe primul nivel al sec¸tiunii din care face parte (adic˘ h = 0), atunci tat˘ al ˆınde par tat al lui x va a Level[x] mod coincide cu tatal sau pr opr iu-zis - Altf el vom ini¸tializa tatal ˆınde par tat al nodului x cu tat˘ al ˆınde par tat al tatalui propriu-zis al lui x
Constr uc¸tia vector ului P se poate realiza f oar te u¸sor folosind o parcurgere ˆın adˆ ancime a ar b or elui. Com plexitat ea tim p a preprocesarii este evident O(n), deoarece vector ii P arent ¸si Level pot fi constr ui¸ti ˆın tim p liniar, iar parcurgerea necesar ˘ ar ii vector ului P se a calcul˘ r ealizeaz˘ a tot ˆın tim p liniar .
Figura 3.4: Vector ul P asociat arborelui din figura 3.3
Capitolul 3. Lowest Common Ancestor
27
Algor itmul 3.2: Constr uc¸tia vector ului P . Parametrul nod al f unc¸tiei r e pr ezinta nodul parcurs la pasul cur ent . La primul apel al f unc¸tiei acesta tr e buie sa fie r adacina arborelui. Func¸tia mai pr ime¸ste ca par ametr ii: r (radacina arborelui) ¸si h (lungimea unei sec¸tiuni).
˘
˘
˘
Dfs(Parent, Level, P, r, h, nod) b egi n if Lev el[nod] < h then P[nod] = r ; else if Level[nod] % h = 0 then P[nod] = Par ent[nod]; else P[nod] = P[Par ent[nod]];
foreach k fiu al lui nod do Dfs(Parent, Level, P, r, h, k );
as puns: Pentru a raspunde la un query LC A(u, v) vom proceda astf el: R ˘ ar tat acela¸si nod (im plicit cele dou˘ - Dac˘ a cele dou˘ a noduri au ca tat˘a ˆınde p˘ a noduri se afl˘ a ˆın aceea¸si sec¸tiune), ˆınseamn˘ a c˘ a cel mai apropiat str amo¸s comun se afl˘ a ori ˆın aceea¸si sec¸tiune cu cele dou˘ a noduri, ori ˆın cel mai r ˘ au caz este chiar tatal ˆınde par tat ˆ al acest or a. In aceast˘ a situa¸tie, putem pur ¸si simplu s˘ a parcurgem lan¸tur ile de la cele dou˘ a noduri pas cu pas pan˘ a ajungem la acela¸si nod. Vom ef ectua cel mult √ 2 h pa¸si, cazul cel mai defavorabil fiind cˆ and cele dou˘ a noduri sunt aflate pe cel este tat˘ mai de jos nivel al sec¸tiunii ¸si cel mai apropiat st r amo¸s comun al ˆınde par tat √ al nodurilor. Fiecare lan¸t va avea ˆın acest caz lungimea h.
- Dac˘ ar ta¸ti noduri dif er ite, atunci va tr e bui ˆıntai s˘ a cele dou˘ a noduri au ta¸ti ˆınde p˘ a parcurgem arborele pan˘ a cand vom avea pentru cele dou˘ a noduri cur ente acela¸si tata ˘ ˆınde par tat . La fiecare pas vom parcurge cˆ ate o sec¸tiune utilizand vector ul P . Avand acum acela¸si tata ˘ ˆınde p˘ ar tat pentru cele dou˘ a noduri cur ente, putem aplica √ metoda descr is˘ a la punctul anter ior . Arborele are cel mult h sec¸tiuni, deci pentr u √ a ce nodurile cur ente parcurgerea pe sec¸tiuni putem ef ectua cel mult 2 h pa¸si. Odat ˘ √
au acela¸si tat ˘a ˆınde par tat vom mai ef ectua cel mult 2 √
h pa¸si, deci ˆın total vom f ace
cel mult 4 h pa¸si. Cazul cel mai nefavorabil este cand avem un arbore liniar. ˆ In acest caz h = n. Deci √
pentru a raspunde la un query vom avea com plexitatea tim p O( n). Pr ezentam mai jos pseudocodul pentru f unc¸tia care pr ime¸ste ca par ametr ii cele doua noduri pentru care dorim sa aflam cel mai apropiat str amo¸s comun ¸si r etur neaza acest str amo¸s. ˘
˘
˘
˘
˘
Capitolul 3. Lowest Common Ancestor
28
√
Algor itmul 3.3: Func¸tia pentru calculul LC A(u, v )(solu¸tie hO(n), O( n)i) QueryLCA(Parent, Level, u, v) b egi n while P [u] = P [v] do if Level[u] > Level[v] then u = P[u]; else v = P [v ];
while u = v do if Level[u] > Level[v] then u = Par ent[u]; else v = Par ent[v ]; return u;
3.3
Solu¸ tie hO(nlog(n)), O(log(n))i
Am putea ob¸tine o com plexitate tim p mai bun ˘ at cea ob¸tinut˘ a decˆ a la solu¸tia anter ioar ˘ astr a ˆın memorie o matrice C[ ][ ] de a folosind tehnica programarii dinamice. Vom p˘ dimensiune n × log(n) pentru care avem: C [i][ j ] = cel de-al 2 j -lea str ˘ amo¸s al nodului i O bser va¸tia 3.1. Fie nodul x din arborele T . ¸tim ¸ al acestui nod est e S c al i-lea st ra mo s ˘
y ¸si al j-l ea st ra mo s ¸ al lui y este z . Atunci nodul z este al (i + j )−l ea st r amo s ¸ al lui x. ˘
˘
Vom calcula matricea C folosind obser va¸tia de mai sus astf el: - Pentru j = 0, nodul cautat este evident tatal nodului i
amo¸s pentru orice nod - Pentru j ≥ 1 presupunem deja calculat cel de-al 2 j −1 -lea str ˘ j −1 din arbore. Fie x cel de-al 2 -lea str amo¸s al lui i. Atunci cel de-al 2 j -lea str amo¸s al lui i va fi cel de-al 2 j −1 -lea str ˘ amo¸s al lui x. Vom avea pentru matricea C ur m˘ at oar ea r ecur en¸ta:
C [i][ j ] =
T [i], C [C [i][ j − 1]][ j − 1],
dac˘ a j = 0 dac˘ a j ≥ 1 ¸si exist˘ amo¸s al lui i a cel de-al 2 j -lea str ˘
Observam c˘ a C [i][ j ] este ini¸tializat ˘ a doar dac˘ a exist˘ a al 2 j -lea str amo¸s al lui i. ˆIn caz contr ar , vom marca acest lucru ini¸tializˆ and C [i][ j ] cu −1. Mai jos pr ezentam tr ans pusa matricii C :
j/i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
-1
1
1
1
2
3
3
3
4
7
7
8
8
12
12
1
-1
-1
-1
-1
1
1
1
1
1
3
3
3
3
8
8
2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
1
1
Capitolul 3. Lowest Common Ancestor
29
Pentru calculul matricii C vom avea com plexitatea tim p O(nlog(n)) pentru ca toate elementele matricii C pot fi ini¸tializate ın tim p constant . ˘
ˆ
Algor itmul 3.4: Preprocesarea arborelui (solu¸tie hO(nlog(n)), O(log(n))i) Preprocess(Parent, C, n) b egi n for i ←− 1 to n do for j ←− 0 to [log2 (n)] do C[i][ j ] = −1; for i ←− 1 to n do C[i][0] = Par ent[i]; for j ←− 0 to [l og2 (n)] do for i ←− 1 to n do if C [i][ j − 1] = −1 then C[i][ j ] = C[C[i][ j − 1]][ j − 1];
3.3.1
s Problema a fl˘ ar ii celui de-al j-lea str ˘ amo¸
Observam c˘ as punde u¸sor ¸si la ˆıntr e bar i de a avand aceast˘ a matrice constr uit˘ a, putem r ˘
ti pul ”Care este al j -lea str amo¸s al nodului i?”. Vom propune ın continuar e o metoda de a raspunde la aceasta ıntr e bar e, fiind alat ur i de problema LC A una din cele mai st udiate b or i. probleme pe ar ˆ
˘ ˆ
˘
˘
a matrice se bazeaz˘ a tot pe obser va¸tia 3.1. Pe j ˆıl Metoda de raspuns folosind aceast˘ x1 x2 putem scrie sub ur matoar ea forma: j = 2 + 2 + . . . + 2xk , x1 > x2 > . . . > xk ≥ 0. Pentru i avem stocat ˆın matricea C cel de-al 2 x1 -lea str amo¸s. Fie acesta y. Pentru y amo¸s ¸s.a.m.d. Fie z cel de-al j -lea str amo¸s al lui i. Am cunostem cel de-al 2x2 -lea str ˘ putea s˘ a ˆıl scriem astf el: z = C [C[C . . . C [i][x1 ]][x2 ] . . .][xk ]
Este de remarcat ca pe z ıl putem scrie ¸si sub forma ur matoar e: ˘
ˆ
z = C [C[C . . . C [i][xk ]][xk −1 ] . . .][x1 ] De f apt orice p er mutar e am lua pentru x1 , x2 , . . . xk vom ob¸tine nodul z .
Pentru a im plementa raspunsul la acest tip de query, vom calcula ın etapa de pr e pr ocesare un vect or Log[ ] de dimensiune n ın care pe p ozi¸tia i vom stoca valoarea [log2 (i)]. Am explicat ınt r -o sec¸tiune pr ecedent a cum putem calcula acest vect or ın tim p liniar . Pr ezentam ın continuar e f unc¸tia care va primi ca par ametr ii nodul i ¸si valoarea j ¸si va ˆ
ˆ
ˆ
˘
ˆ
returna cel de-al 2 j -lea str amo¸s al nodului i.
ˆ
Capitolul 3. Lowest Common Ancestor
30
Algor itmul 3.5: Func¸tia pentru calculul celui de-al 2 j -lea str amo¸s al nodului i ˘
Quer yAncest or (C, Level, Log, i, j ) b egi n L = Log[ j ]; Ancestor Level = Level[i]− j ; for k ←− L downto 0 do if Level[i] − 2 j ≥ Ancestor Level then i = C[i][k ];
Aceast˘ a im plementar e a raspunsului f olose¸ste prima f orm˘ a de scriere men¸tionat ˘ a mai
sus a str amo¸sului cautat. Pentru a ˆın¸telege mai bine cum calculeaz˘ a aceast˘ a metod˘ a str amo¸sul cautat vom pr ezent a ˆın continuar e un exem plu.
E xe m p lu: Cautam al 3-lea str amo¸s al nodului 15 ın arborele pr ezentat ın figura 3.3. Avem 3 = 21 + 20 . Vom calcula: ˆ
ˆ
- Al 2-lea str amo¸s al lui 15, adic˘ a C[15][1] = 8 - Primul str amo¸s al lui 8, adic˘ a C[8][0] = 3
Com plexitat ea tim p a unui astf el de query este O(log(n)). Pentru un query se obser v˘ a c˘ a ef ectuam log( j ) pa¸si. Cazul cel mai defavorabil este cˆ and avem un arbore liniar
¸si se cere al n − 1 str amo¸s al nodului de pe ultimul nivel. Acest str amo¸s va fi chiar r adacina. ˘
˘
Vom reveni acum la calculul celui mai apropiat str ˘ amo¸s comun a dou˘ a noduri u ¸si v
a cazur i: utilizand matricea C. Distingem dou˘ - Cele dou˘ am cu w cel mai apropiat str amo¸s comun a noduri sunt pe acela¸si nivel. Not˘ amo¸sii celor dou˘ al nodurilor. S ¸ tim c˘ a str ˘ a noduri afla¸ti pe un nivel mai mic decat nivelul lui w coincid. Am putea a¸sadar s˘ ar ii binar e: a facem o cautar e similar ˘ a c˘ aut˘ dac˘ a str amo¸sii celor dou˘ a noduri coincid, c˘ autam cel mai apropiat str amo¸s comun pe un nivel mai jos, dac˘ a sunt dif er i¸ti, vom cauta pe un nivel mai sus. Fie log = log2 (Level(u)) ¸si init¸ial k = log. Ver ific˘ a al 2k -lea str amo¸s al lui u coincide am dac˘ cu al 2k -lea str amo¸s al lui v: - ˆ In caz afirmativ cel mai apropiat str amo¸s comun este fie undeva pe un nivel mai jos decat acest str ˘ amo¸s, fie este exact acesta. Vom continua cautar ea p e un nivel mai jos, com par ˆ and al 2k −1 -lea str amo¸s al lui u cu cel de-al 2k −1 -lea str amo¸s al lui v . - Dac˘ a al 2k -lea str amo¸s al lui u (pe care ˆıl vom nota cu su) este dif er it de al 2k -lea str amo¸s al lui v (pe care ˆıl vom nota cu sv), ˆınseamn˘ a c˘ a cel mai apr opiat str amo¸s comun este pe un nivel mai sus. Vom continua caut ar ea comparand al 2k −1 -lea str amo¸s al lui su cu al 2k −1 -lea str ˘ amo¸s al lui sv . Vom r e p et a ace¸sti pa¸si pentru log ≥ k ≥ 0. ˆIn cele din ur m˘ a vom ob¸tine dou˘ a nodur i, su ¸si sv, dif er ite, dar pentru care avem P ar ent[su] = P ar ent[sv] = cel mai apr opiat
Capitolul 3. Lowest Common Ancestor
31
str amo¸s comun al lui u ¸si v. Vom face log pa¸si, unde log = log2 (Level(u)). Cazul
cel mai nefavorabil este cand avem un arbore similar celui din figura 3.2 ¸si ni se cer e
amo¸s comun al nodurilor de pe ultimul nivel. ˆIn acest caz cere cel mai apropiat str ˘ vom avea com plexitat ea t im p pentru acest query O (log(n)). - Cele dou˘ a noduri sunt pe niveluri dif er ite. Fie u pe nivelul i ¸si v pe nivelul j , cu i > j. Folosind metoda pr ezentat˘ a anter ior , putem calcula str amo¸sul lui u care se acela¸si nivel cu v (fie z acest str amo¸s: va fi al (i − j )-lea str amo¸s al lui afla ˘ pe u). Avand acest nod vom putea afla cel mai apropiat str ˘ amo¸s comun al lui u ¸si v, aplicand metoda de la punctul anter or pentru nodurile z ¸si v. Pentru aflar ea str amo¸sului lui u care se afl˘ a pe acela¸si nivel cu v avem com plexitatea O(log(n)), iar pentru aflarea celui mai apropiat str ˘ amo¸s comun a dou˘ a noduri aflate pe acela¸si nivel com plexitatea tim p este de asemenea O(log(n)). Deci ¸si ˆın acest caz vom avea com plexitatea tim p O(log (n)).
E xe m p lu: Calculam LC A(10, 15) pe arborele din figura 3.1. Observam ca cele doua noduri sunt pe niveluri dif er ite, deci va tr e bui mai ıntai sa aflam str amo¸sul nodului 15 aflat pe nivelul 3 al arborelui; ın acest caz este primul str amo¸s al lui 15, deci nodul 12. Vom calcula acum cel mai apropiat st r amo¸s comun al nodurilor 10 ¸si 12. Avem log = log2 (Level(10)) = 2. Incer cam ıntai sa comparam str amo¸sii de ordin 4 ai celor doua noduri, ınsa pe arborele dat ace¸stia nu exista. Incer cam apoi sa comparam str amo¸sii de ordinul 2 ¸si observam ca ace¸stia coincid: nodul 3. Continuam cautar ea com par and pr imii str amo¸si. Ace¸stia sunt dif er i¸ti: nodurile 7 ¸si 8. Tat al lor este nodul cautat, adica 3. ˘
ˆ
˘
˘
ˆ
˘
˘
ˆ
ˆ
ˆ
˘
˘
˘
˘
ˆ
˘
˘
˘
˘
˘
Algor itmul 3.6: Func¸tia hO(n log(n)), O(log(n))i)
pentru
QueryLCA(Parent, Level, Log, C, u, v ) b egi n if Lev el[u] < Level[v] then aux = u; u = v; v = aux;
log = Log[Level[u]]; for i ←− log downto 0 do if Level[u] − 2i ≥ Level[v] th en u = C[u][i]; if u = v then return u; for i ←− log downto 0 do if C [u][i] = −1 and C [u][i] = C [v ][i] then u = C[u][i]; v = C[v ][i];
return P ar ent[u];
calculul
ˆ
˘
LC A(u, v)
(solu¸tie
Capitolul 3. Lowest Common Ancestor
3.4
32
Un algor itm off-line simplu pentru calculul LC A
Acest algor itm presupune date arborele T ¸si o mul¸time P = {{u, v}} de m perechi de
amo¸s comun. Descr iem noduri din T pentru care dorim sa minam cel mai apropiat str ˘ ˘ det er mai jos pa¸sii acestui algor itm: - Pentru fiecare nod x al arborelui vom const r ui o list˘ a de perechi de nodur i: L[x] = {{u, v} | {u, v} ∈ P si x = u} Cu alte cuvinte ˆın aceast˘ a list˘ a pastr am toate query-urile ˆın care pe prima pozi¸tie apare nodul x. Vom mai pastra ˆın memorie vect or ul P ar ent[ ] ˆın care pe p ozi¸tia i vom r e¸tine tatal nodului i. - Vom ef ect ua o parcurgere a arborelui ˆın adancime. Pentru aceast˘ a parcurgere ne va fi util un vect or Activ[ ] de dimensiune n ˆın care pe p ozi¸tia i vom avea valoarea 1 dac˘ a ˆ nodul i se afl˘ a pe lan¸tul dintr e nodul cur ent ¸si radacina sau 0 ˆın caz contr ar . In acest vect or avem pr actic marcate nodurile care apar pe lan¸tul dintr e r ada a ¸si nodul ˘cin˘ cur ent . De-a lungul acest ei parcurgeri pentru fiecare nod x executam ur mat or ii pa¸si:
Il marcam ca activ. - ˆ - Parcurgem list a de query-uri ˆın care acesta apare, adic˘ a L[x]. Pentru fiecar e query {x, u}, cel mai apropiat st r amo¸s comun se afl˘ acin˘ a pe lan¸tul dintr e r ˘ ad˘ a ¸si nodul x, deci va fi marcat ca activ. Pentru a-l g˘ asi, putem s˘ a parcurgem pr in legat ur ile fiu-tat a nodurile de la u la un nod care este marcat ca activ. Pr imul
nod marcat ca activ va fi cel mai apropiat st r amo¸s comun al nodurilor x ¸si u. - Parcurgem to¸ti fii lui x.
am ca inactiv. - ˆInainte de a parasi nodul x, ˆıl mar c˘
E xe m p lu: Presupunem dat arborele din figura 3.1 ¸si P = {{10, 15}}. Cand par cur gerea va ajunge sa viziteze nodul 10, vom avea ın stiva asociat a parcurgerii nodurile 1, 3, 7, 10, deci vector ul Activ va arata astf el: ˆ
˘
ˆ
˘
Figura 3.5: Vector ul Activ la parcurgerea nodului 10 a arborelui din figura 3.1
Vom parcurge, plecand din nodul 15, prin leg˘ at ur i fiu-tat a toate nodurile pan˘ a la ıntalnir ea unui nod marcat ca activ: 15, 12, 8, 3. Nodul 3 este marcat ca fiind activ, deci
ˆ
amo¸s comun al nodurilor 10 ¸si 15. acesta este cel mai apropiat str ˘ Com plexitat ea tim p a algor itmului este O(nm). Par cur ger ea ˆın adancime are com plexi-
tatea tim p O(n). Avem date m query-uri ¸si pentru fiecare query vom avea ın cel mai def avorabil caz com plexitat ea tim p O(n). Deci com plexitatea totala va fi O(n + mn) = O(mn). Pr ezentam mai jos f unc¸tia de parcurgere ın adancime a arborelui modificat a astf el b or elui ıncat sa r as pund a la lista de query-uri. Pentru par ametr ul nod vom da r adacina ar la primul apel al f unc¸tiei. ˆ
˘
ˆ
ˆ
˘
˘
ˆ
˘
˘
Capitolul 3. Lowest Common Ancestor
33
Algor itmul 3.7: Algor itm off-line (com plexitat e tim p O(nm)) Dfs(Parent, Act iv, L, no n o d) b egi n Activ[no d] = 1; foreach u such that {nod, u} ∈ L[nod] do Ancestor = u; while Act iv [Anc Ancest or ] = 0 do Ancest or = Par ent[Ancestor ];
”,” + u + ”)=” + Ancest or print ”LCA(” + nod + ”,” +
foreach k son of nod do Dfs(Parent, Activ, L, k ); Activ[no d] = 0;
jan Algo r itmul off-line al lui Tar
3.5
time Acest algor itm presupune date, ca ¸si si algor itmul descris anter ior , arborele T ¸si si o mul¸ P = {{u, v}} de m perechi de noduri din T pentru care dorim s˘ a deter minam am cel mai ˘ olose¸ste ca str uct ur ˘ apropiat str amo¸s comun. Algor itmul f olose a de date auxiliar ˘ a mul¸timi ectiv algor it mul, vom pr eze ezenta p e scur t aceast˘ dis juncte. ˆ Inainte de a descrie ef ec de de a str uctur a ˘ date.
Mul¸timi dis juncte
3.5.1
Presupunem d at ˘ a o mul¸time cu n elemente. Structura de date numit˘ a mul¸timi dis juncte ne a jut˘ a s˘ a parti¸tionam tionam mul¸timea dat ˘ a ˆın mai multe submul¸timi dis jun cte. Aceasta ˘ str uctur ˘ izat ˘ acter iz a este car ac a de trei oper a¸tii:
- Mak eSe eSet: constr uie¸ste o submul¸time f orm ormat˘ a dintr -un singur element - Find: deter min˘ a submul¸timea ˆın care se afla ˘ un element - Union: r eune¸ste dou˘ a submul¸timi
Pentru a putea identific fica o submul¸t ime, vom alege un element al ei ca r e pr eze ezent ant . el, oper a¸tia Mak eSe eSet(x) va constr ui o submul¸time al carei r e pr eze ezentant va fi elemenAstf el timii din care face parte x, iar tul x, oper a¸tia Find(x) va returna r e pr eze ezent antul submul¸ tin elementele x ¸si oper a¸tia Union(x,y) va reuni submul¸timile carora le apar¸tin si y. O metoda de im plementar e a acestei structuri de date ar fi cu liste: fiecare submul¸time va fi r e¸tinuta ca o lista simplu ınlan an¸tuita, a, primul element din lista fiind considerat r e pr eze ezentantul listei. O p er a¸tia Union se poate face ın tim p constant, fiind necesar a adaugarea un ei liste la sf ar ¸si sit ul altei liste. Pentru oper a¸tia Find ınsa ar tr e bui par cur sa toata lista, ceea ce ar ınsemna o com plexitate tim p O(n) ın cel mai defavorabil caz. Cele trei oper a¸tii el. Vom pr eze ezent a ın continuar e ar putea fi executate mai rapid, abor dan and problema altf el aceasta abordare mai r ap apida. ˘
˘
˘
ˆ
˘
˘
˘
ˆ
˘
ˆ
ˆ
˘
˘
ˆ
ˆ
˘
˘
ˆ
Capitolul 3. Lowest Common Ancestor
34
P˘ adu adu r i de mul¸timi dis jun cte ezentat ˘ Fiecare submul¸time va fi r e pr eze as astr a a ca un arbore. Pentru fiecare nod vom p˘
ıntr -un vector T [ ] tatal acestuia din arborele din care face parte. R e pr eze ezent antul unei
ˆ
submul¸timi va fi radacina arborelui. Pentru acest nod vom ini¸tializa tatal sau cu el ˆınsu¸si si.
Cele trei oper a¸tii pot fi realizate astf el: el: - Mak eSe eSet(x): va ini¸tializa tatal lui x cu x. - Find(x): va parcurge lan¸tul arborelui prin legat at ur ile tul de la nodul x pan˘ a la radacina arborelui prin ile ˘
b or el ac acina ar fiu-tat a ¸si si va returna r ad˘ elui.
ar ar or tin elementele x ¸si si y, ini¸tializand - Union(x, y): va uni cei doi arbori c˘ or a le apar¸tin
tatal radacinii arborelui car acina arborelui car ar uia ıi apar¸ ar uia ıi apar ¸tine ap ar¸tine ti ne x cu r adac ˘
ˆ
˘
˘
ˆ
y. Observam ˆıns˘ at ˘ a c˘ a aceast˘ a abordare nu aduce o ˆım bunat a¸tir e r emar cabil˘ a com plexit˘ a¸tii ˘ ezentam mai jos dou˘ br a¸ti. Pr eze tim p pentru c˘ at ¸tir i a arborii ob¸tinu¸ tinu¸ti ti pot fi dezechili b a ˆım bunat ˘ care pot fi aduse metodei:
sam arborele cu ˆın˘ - Atunci cand unim doi arbori, ar fi util s˘ al al¸timea mai mica la la a ata¸sam ˘ cel cu ˆınal¸timea mai mare. Dac˘ si ˆınal¸time, atunci vom a cei doi arbori au aceea¸si ob¸tine un arbore cu ˆınal¸timea cu o unitate mai mare decat ˆınal¸timea arborilor ini¸tiali, altf el al al¸timea arborilor ini¸tiali. Vom renun¸ta el aceasta nu va de p˘ a¸si si ˆın˘ ta la ter menul de si vom folosi ter menul de rang ˆın context ul ˆın care este f olosi olosit˘ si a doua ınal¸time ¸si a ¸si
ˆ
metod˘ a de optimizar e.
Vom r e¸tine ˆın memorie un vector Rang[ ] ˆın care p entr u
fiecare nod r e pr eze ezentant vom pastra rangul arborelui pe care ˆıl r e pr ezi ezint a. - De fiecare dat ˘ a cand parcurgem un lan¸t al arborelui, am putea pentru fiecare nod de am nodul dir ec pe lan¸t s˘ a modificam tatal ¸si si s˘ a at a¸sam ect de r ada adacina. Aceast˘ a modific ficar e ˘ ˘ va ˆım bun at ¸ti atat oper a¸tiile care im plica ar or or a li s-a modificat tatal, cat ˘ nodurile car ˘
¸si si cele care le r ef er a dir ec ect sau indir ec ect. ˘
ezentat e mai sus, o S-a demonstr at at c˘ a aplicand cele dou˘ a tehnici de optimizar e pr eze secven¸t˘ a de m oper a¸tii Mak eSe eSet, Find ¸si si Union, dint r e care n oper a¸tii sunt Mak eSe eSet, p ot ∗ ∗ fi realizate ˆın com plexitat ea tim p O(mlog n), unde f un el: unc¸tia log n se define¸ste astf el:
( log ∗ n =
0, dac˘ an ≤ 1 1 + log (log(n)), dac˘ an > 1 ∗
Algor itmul 3.8: O per a¸tia Mak eSe eSet pentru paduri de mul¸timi dis juncte Mak eSet (x) b egi n T[x] = x; Rang[x] = 0;
Capitolul 3. Lowest Common Ancestor
35
si U nion pentru pad Algor itmul 3.9: O per a¸tiile F ind ¸si adur i de mul¸timi dis juncte ˘
Find(x) b egi n if x = T [x] then return x;
T[x] = Find(T[x]); return T [x];
Union(x, y ) b egi n x = Find (x); y = Find(y); if x = y then r etur n if R an ang [x] < R an ang [y ] then T[x] = y; else if R an ang [y ] < R an ang [x] th en T[y] = x; else T[x] = y; Rang[y] = R ang[y]+1;
Algor itmul lui Tar jan
3.5.2
ezolv˘ si algor itmul offline pr eze ezentat Algor it mul lui Tarjan r ezol a problema LC A folosind, ca ¸si
b or e anter ior , o par cur ge ger e ın adancime a arborelui. Vom contr ui pentru fiecare nod x din ar o lista cu toate query-urile ın care apare, indif er ent ca este pe prima sau a doua p ozi¸tie: ˆ
˘
ˆ
˘
˘
L[x] = {{u, v} | {u, v} ∈ P si x = u sau x = v} Vom folosi o stiv˘ a S tack [ ] ˆın care, la un moment dat al parcurgerii arborelui, vom
r e¸tine toate nodurile de pe lan¸tul si nodul cur ent acina (aflat a la baza stivei) ¸si tul dintr e r adac actic, un nod va intra ın stiva atunci can and este vizitat , va r aman ane (aflat ın varful stivei). Pr ac ar as pe stiva atata tim p cat sunt vizita¸ti fiii sai ¸si asi si va ie¸si si din stiva cand parcurgerea va par nodul. Algor it mul lui Tarjan f olose olose¸ste ca str uct ur a de date auxiliar a ¸si si mul¸timile dis juncte astf el: el: ˘
ˆ
˘
ˆ
˘
˘
˘
ˆ
ˆ
˘
˘
˘ ˘
˘
- Atunci cand este vizitat un nod, se va forma o nou˘ ormat a a submul¸time f orm ˘ din acest
nod. - At unci cand parcurgerea par ˘ as ase¸ste nodul, submul¸timea din care face parte nodul
timea par intelui s˘ actic, atunci cand par cur ge cur ent este r eunita au au. Pr ac ger ea ˘ cu sub mu l¸ revine din r ec ecur si sivitat e la nodul cur ent, fiii sai vor fi deja vizita¸ti ¸si si vor face par te din submul¸timea nodului cur ent. Deci vom adau auga la submul¸timea tatalui nodului ˘
at ¸si cur ent atat nodul cur ent , cat si to¸ti fiii acestuia. ˆ
Capitolul 3. Lowest Common Ancestor
36
g and arborele am ajuns la nodul x aflat pe nivelul p. I n Lema 3.1. Presupunem ca parcur acest moment avem formate p submul ¸t imi d i s juncte. ˆ
˘
ˆ
Demon str a¸tie: Este evident ca pentru fiecare nod din stiva vom avea cate o submul¸time. Reuniunea acest or submul¸timi va forma mul¸timea tuturor nodurilor vizitat e pana la acest moment. Submul¸timea cor es punzatoar e unui nod va con¸tine fiii sai vizit a¸ti, exce ptand nodurile aflate ın stiva ¸si fiii acestor a. In stiva am precizat ca vom pastr a nodurile de p e lan¸tul dintr e r adacina ¸si nodul cur ent. Cum nodul cur ent se afla pe nivelul p, ın stiva vom avea p noduri, deci vor fi formate p submul¸timi cor es punzat oar e acest or nodur i. ˘
˘
ˆ
˘
˘
ˆ
˘
ˆ
˘
˘
˘
ˆ
˘
˘
ˆ
˘
˘
b or elui Pr ezentam ın continuar e submul¸timile formate ın parcurgerea ın adancime a ar din figur a 3.1 la moment ul vizit ar ii nodului 15. Cele 4 noduri din stiva sunt 1, 3, 8 ¸si 12 ¸si fiecaruia ıi corespunde cate o mul¸time. ˆ
ˆ
ˆ
˘
˘
ˆ
Figura 3.6: Submul¸timile dis juncte formate pˆ an˘ a la momentul vizit˘ ar ii nodului 15
Vom r e¸tine ˆın memorie un vect or Color [ ] de dimensiune n ˆın care pe p ozi¸tia i vom avea valoarea 1 (caz ˆın care vom spune c˘ ai au f ost a i este negru) dac˘ a nodul i ¸si to¸ti fiii s˘ deja vizita¸ti sau 0 ˆın caz cont r ar (caz ˆın care vom spune c˘ a i este alb). Vom ˆıncer ca s˘ a
a raspundem la un query {u, v} atunci cand unul dintr e noduri este vizitat. Presupunem c˘ parcurgerea a ajuns la nodul u. Vom proceda astf el: - Dac˘ a nodul v este alb, nu vom putea raspunde ˆınc˘ a la query.
Acest query ˆıns˘ a se
afl˘ a ¸si ˆın list˘ a de query-uri a nodului v. Atunci cand vom vizita nodul v, u va fi
marcat ca nod negru ¸si vom putea raspunde la query. - Dac˘ a nodul v este negru, ˆınseamn˘ a c˘ a exist˘ a o submul¸time caruia acesta ˆıi apar ¸tine. Cel mai apropiat str amo¸s comun al lui u ¸si v se afl˘ a pe lan¸tul dintr e u ¸si r adacina,
Capitolul 3. Lowest Common Ancestor
37
deci se va regasi ¸si ˆın stiv˘ a. Este de f apt nodul din stiv˘ a aflat ˆın aceea¸si submul¸time cu nodul v. Pentru a putea avea acces rapid la el, vom r e¸tine ˆın memorie un vect or
Ancestor [ ] de dimensiune n ˆın care pentru fiecare nod r e pr ezentant al unei mul¸timi vom r e¸tine nodul din stiv˘ a cor es punzator mul¸timii pe care o r e pr ezinta. Avand acest amo¸s comun al nodurilor, va tr e bui vect or constr uit , pentru a afla cel mai apropiat str ˘ s˘ a luam valoarea din Ancestor pentru nodul r e pr ezentant al mul¸timii din care f ace
parte v .
Pentru a constr ui vector ul Ancestor, va tr e bui ca de fiecare dat a cand ef ectuam o oper a¸tie Union ıntr e un nod x ¸si un fiu al sau k sa ini¸tializam valoarea din Ancestor pentru nodul r e pr ezentant al noi submul¸timi cu x. Observam ca folosind acest vector , nu mai este nevoie sa r e¸tinem ¸si stiva. Pr ezentam mai jos f unc¸tia ce parcurge ın adancime arborele ¸si r as punde la lista de query-uri. Ini¸tial vector ul Color va avea toate valorile ini¸tializat e cu 0. Func¸tia va fi apelat a cu radacina arborelui ca par ametr u. ˘
ˆ
˘
˘
˘
˘
ˆ
˘
˘
jan Algor itmul 3.10: Algor itmul off-line al lui Tar Df s(Ancest or , Color, L, u) begin Mak eSet(u) ; Ancestor [Find[u]] = u; foreach k son of u do Df s(Ancestor , Color, L, k ); Union(u,k ); Ancestor [Find(u)] = u;
Color[u] = 1; // nodul u devine negru
foreach node v such that {u, v} ∈ L[u] do if C ol or [v] = 1 th en print ”LCA(” + u + ”,” + v + ”)=” + Ancestor [Find(v )]);
Pentru a calcula com plexitatea tim p a algor itmului lui Tarjan vom ¸tine cont de: - Com plexitat ea parcurgerii ˆın adancime: O(n). - Com plexitatea oper a¸tiilor Mak eSet, Union ¸si Find. R emar c˘ a avem n oper a¸tii am c˘ Mak eSet , n oper a¸tii Union ¸si n + m oper a¸tii Find. Deci, ˆın total, vom avea 3n + m astf el de oper a¸tii, dintr e care n oper a¸tii sunt Mak eSet . Com plexitat ea total˘ a a acest or a va fi O((m + n)log∗ n).
a a algor itmului va fi, a¸sadar : Com plexitat ea total˘ O(n + (m + n)log∗ n) = O((m + n)log∗ n)
3.6
LC A pe arbori binari compl e¸ ti
ar ii celui mai apropiat str ˘ amo¸s comun p e Vom continua discu¸tia cu descrierea deter min˘ un arbore binar com plet. Arborii binari com ple¸ti sunt un caz par ticular de arbori ¸si, ˆın
Capitolul 3. Lowest Common Ancestor
38
general, problemele se sim plific˘ a mult p e acest tip de arbori. Am ales s˘ a pr ezentam solu¸tia
descr is˘ a ˆın continuar e pentru c˘ a este f oar te inter esant˘ a din punct de vedere algor itmic ¸si f oar te dif er it˘ a f a¸t˘ a de abordarile pr ecedente. Trebuie precizat c˘ a algor itmul pr ezentat ˆın continuar e este on-line.
Presupunem c˘ a avem dat arborele binar com plet B, cu p frunze (deci n = 2p − 1 noduri). B va avea adancimea log2 p + 1 ¸si toate frunzele se vor afla pe nivelul d = log2 p. Vom asocia fiecarui nod din arbore un numar care, scris ˆın binar, va ocupa d + 1 bi¸ti. Acest numar ”codifica” ˆın mod unic drumul de la r ˘ acin˘ ad˘ a la un anumit nod. Numar ˆ and de la
ar va corespunde muchiei i din drumul de la r ˘ stanga la dreapta, bitul i din num˘ la adacin˘ a nodul cur ent: - dac˘ a muchia i merge la fiul stˆ ang, bitul i va fi 0 - dac˘ a muchia i merge la fiul drept, bitul i va fi 1 Vom adauga apoi la dreapta acest or bi¸ti un bit 1 ¸si at ˆ a¸tia bi¸ti 0 cˆ a¸ti sunt necesar i ar eticheta nodului. pentru a ob¸tine ˆın total d + 1 bi¸ti. ˆIn continuar e vom numi acest num˘ Pr ezentam mai jos un arbore binar com plet cu 8 noduri f r unz˘ a ¸si etichetele nodurilor scr ise atat ˆın binar (ˆın inter ior ul nodurilor), cat ¸si ˆın zecimal (ˆın afara nodur ilor ).
Figura 3.7: Arbore binar com plet etichetat
Se obser v˘ a c˘ a etichetele nodurilor au o semnifica¸tie bine cunoscuta: r e pr ezint˘ a numerotarea nodurilor ˆıntr -o parcurgere a arborelui ˆın inordine. R eamintim ca ıntr -o par ˘ ˆ
am ˆıntˆ curgere ˆın inordine a unui arbore vizit˘ ai subarborele stˆ ang, apoi radacina ¸si apoi subarborele dr e pt .
Lema 3.2. Ef ect uand o parcurgere ˆın ordine ¸si numer ot and nodurile ˆ
ˆ
ın ˆ
inordinea ˆın car e
sunt parcurse, atunci pentru fiecare nod, numarul ob ¸t inut din parcurgerea ˘
ın ˆ
ordine va
coincide cu eticheta nodului r es pectiv.
Demon str a¸tie: Vom demonstr a prin induc¸tie dup a adancimea arborelui (h). R eamintim ca h + 1 = d. Pentru h = 1 avem un arbore cu un singur nod a car ui eticheta va fi 1. Pentru acest arbore este evident ca afir ma¸tia este adevar at a. ˘
˘
˘
˘
˘
˘
˘
Capitolul 3. Lowest Common Ancestor
39
cu a afir ma¸tia pentru orice arbore cu adˆ ancimea mai mic˘ a s˘ au egal˘ a Presupunem adevar at˘
am c˘ h ¸si ˆıncer cam s˘ a demonstr am pentru un arbore de adˆ ancime h + 1. O bser v˘ a subarborele stang este un arbore binar com plet de adancime h, la fel ¸si subarborele dr e pt.
Pentru ace¸stia avem deja calculate etichetele nodurilor ¸si ¸stim ca acestea coincid cu numerele de ordine ın parcurgerea ın inordine. Pornind de la aceste etichete, putem defini etichetele arborelui de adancime h + 1: ˘
ˆ
ˆ
- La etichetele nodurilor arborelui de ˆın˘ al¸time h ce constituie subarborele stˆ ang al radacinii vom adauga un 0 la stˆ anga bi¸tilor .
Aceast˘ a adaugare nu va modifica
etichetele nodur ilor
- Radacina va avea ca a asociat ˘ a un bit 1 urmat de h bi¸ti de 0; ˆın sistemul ˘ et ichet ˘ zecimal acest numar fiind 2h . - La etichetele nodurilor arborelui de ˆın˘ al¸time h ce constit uie subarborele drept al radacinii vom adauga un bit 1 la stanga bi¸tilor . Aceast˘ a ad˘ augar e va modifica etichetele asociate nodurilor din subarborele drept, incr emetandu-le cu 2h .
ar ului de ordine a nodur ilor Remarcam c˘ a etichetele nodurilor arborelui corespund num˘ ın parcurgerea ˆın inordine: cele din subarborele stˆ ang nu se modific˘ a (deci vom avea
ˆ
b or elui), etichete de la 1 la 2 h − 1 cor es punzatoar e unei parcurgeri ˆın inordine a subar radacina va avea c˘ a etichet˘ a chiar 2h , iar etichetele nodurilor din subarborele drept vor fi ın inter valul [2h + 1, 2h+1 − 1] (cor es pun zatoar e de asemenea unei parcurgeri ˆın inor dine a b or elui). subar
ˆ
A¸sadar avand dat un arbore binar com plet, vom putea asocia nodurilor etichetele ef ectuand o parcurgere ın inordine. Pentru a calcula LC AB (u, v) va tr e buie sa aflam ˆ
˘
˘
ıntai etichetele celor dou˘ a noduri ¸si cu a jutor ul acestor a vom putea afl˘ a eticheta celui mai apropiat str amo¸s comun. Va tr e bui deci s˘ a pastr am ˆın memorie doi vector i, Label[ ] ¸si
ˆ
V er tex[ ] de dimensiune n pentru care avem:
La bel[i] = eticheta asociat a nodului i V er tex[i] = nodul din arbore caruia ıi corespunde etichet a i ˘
ˆ
Facand aceasta specificare, putem mai de par te sa ne ocupam doar de rezolvarea quer yurilor LC A pe un arbore ce are nodurile numerotate conform ordinii lor ın parcurgerea ın ˘
˘
˘
ˆ
ˆ
inordine.
R ˘ as punsul la un query LC AB (u, v) va avea doi pa¸si: - Verificarea dac˘ a LC AB (u, v) = u sau LC AB (u, v) = v - ˆIn cazul ˆın care cel mai apropiat str ˘ a noduri este dif er it de amo¸s comun al celor dou˘ acestea, aflarea lui Vom descrie mai ˆıntai o metod˘ a de a preprocesa arborele astf el ˆıncat s˘ a putem afla ˆın
tim p constant daca cel mai apropiat str amo¸s comun a doua noduri este unul dintr e ele. Va tr e bui sa constr uim vector ul Level[ ] de dimensiune n ın care pe p ozi¸tia i vom r e¸tine nivelul nodului i. Vom mai r e¸tine ın memorie un alt vector B[ ] de dimensiune n ın care ˘
˘
˘
˘
ˆ
ˆ
ˆ
Capitolul 3. Lowest Common Ancestor
40
pe p ozi¸tia i vom r e¸tine p ozi¸tia celui mai semnificativ bit ( bitul 1 aflat cel mai la stanga ˆın
r e pr ezentar ea binar a a lui i) considerand ca numerotarea p ozi¸tiilor se face de la stanga. Ambii vector i pot fi const r ui¸ti ın tim p liniar. Pr ezentam mai jos pseudocodul f unc¸tiei care calculeaza vect or ul B . ˘
˘
ˆ
˘
˘
Algor itmul 3.11: Calculul vector ului B Preprocess(B, n, d) b egi n B[1] = d + 1; for i ←− 2 to n do B[i] = B[i/2]−1;
Pentru ca cel mai apropiat str amo¸s comun a doua noduri u ¸si v sa fie spre exem plu ˘
˘
u, tr e buie ca u s˘ a fie str amo¸s al lui v. ˆIn acest caz, primii x bi¸ti din etichetele celor dou˘ a noduri vor coincide, unde x este nivelul lui u. Pentru a putea testa acest lucru, putem f ace XOR ˆıntr e u ¸si v. R eamintim c˘ a XOR-ul a doi bi¸ti este 1 dac˘ a ¸si numai dac˘ a cei doi bi¸ti sunt dif er i¸ti, iar XOR-ul a dou˘ a numere se ob¸tine r ealizˆ and XOR inde pendent ˆıntr e fiecar e bit al celor dou˘ a numere. Vom aplica oper a¸tia XOR ˆıntr e u ¸si v ¸si vom ob¸tine o valoare pe ar and care o vom nota cu xuv . Calculam p ozi¸tia celui mai din stˆ anga bit 1 din xuv (num˘
p ozi¸tiile de la stanga). Folosind vector ul B, vom putea afla ˆın tim p constant aceast˘ a pozi¸tie pe care o notam cu k. Avand cel mai din stˆ anga bit 1 pe p ozi¸tia k, ˆınseamn˘ a c˘ a primii k − 1
bi¸ti (numarand de la stanga) ai lui u ¸si v coincid, deci drumurile de la r adacina la cele doua ˘
˘
˘
˘
noduri au primele k − 1 muchii comune, iar apoi vor continua pe muchii dif er ite. Dac˘ a
p ozi¸tia celui mai semnificativ bit al lui xuv este mai mare decat nivelul lui u, atunci u este str amo¸s al lui v. Observam c˘ a avand vector ii Level ¸si B constr ui¸ti, putem deter mina ˆın
tim p constant daca cel mai apropiat str amo¸s comun a doua noduri este unul dintr e acestea. ˘
˘
˘
E xe m p lu: Vom verifica daca 4 este str amo¸s al nodului l ın arborele pr ezentat ın figur a 3.7. R e pr ezent ar ile ın binar ale celor doua noduri sunt (0100) ¸si (0001) ¸si aplicandu le oper a¸tia XOR vom ob¸tine valoarea (0101). O bser vam ca cel mai semnificativ bit al acestei valori se afla pe p ozi¸tia 2 (numar and de la stanga). Acest lucru ınseamna ca cele doua noduri au prima muchie de pe drumul de la r adacina la ele comuna. Cum nodul 4 se afla pe nivelul 1, ob¸tinem ca 4 este str amo¸s al lui 1. Vom verifica acum daca 10 este str amo¸s al lui 13. R e pr ezentar ile ın binar ale celor doua noduri sunt (1010) ¸si (1101) ¸si aplicandu-le oper a¸tia XOR vom ob¸tine valoarea (0111). O bservam ca cel mai semnificativ bit al acestei valori se afla pe p ozi¸tia 2 (numar and de la stanga). Acest lucru ınseamna ca cele doua noduri au doar prima muchie de pe drumul d e la r adacina la ele comuna. Nodul 10 se afla pe nivelul 2 arborelui, deci 10 nu este str amo¸s ˘
ˆ
ˆ
ˆ
˘
˘
˘
˘ ˆ
ˆ
˘
˘
˘
˘
ˆ
˘
˘
˘
˘
˘
˘
˘
˘
ˆ
˘
ˆ
˘
˘
ˆ
˘
˘
˘
˘
˘
˘
al lui 13.
Pr ezentam ın continuar e pa¸sii ce tr e buiesc urma¸ti pentru a afla cel mai apr opiat str amo¸s comun a doua noduri u ¸si v, ¸stiind ca acesta este dif er it de u ¸si v: ˆ
˘
˘
˘
- Vom aplica oper a¸tia XOR ˆıntr e valorile u ¸si v. Vom ob¸tine o valoare pe care o vom nota cu xuv
Capitolul 3. Lowest Common Ancestor
41
- Calculam p ozi¸tia celui mai din stanga bit 1 din xuv . Vom folosi vect or ul B ¸si vom putea afla ˆın tim p constant aceast˘ a p ozi¸tie pe care o notam cu k. Avˆ and cel mai din stanga bit 1 pe p ozi¸ tia k, ˆınseamn˘ a c˘ a primii k − 1 bi¸ti (numarand de la stˆ anga) ai
lui u ¸si v coincid, deci drumurile de la r ad˘ acin˘ a la cele dou˘ a noduri au primele k − 1 muchii comune, iar apoi vor continua pe muchii dif er ite. A¸sadar eticheta celui mai
apropiat str amo¸s comun va con¸tine primii k − 1 bi¸ti ai nodului u (sau v, dat fiind ca
˘
ace¸stia coincid), urmat de un bit 1, urmat de d + 1 − k bi¸ti 0 - Pentru a constr ui numarul precizat mai sus vom proceda astf el: vom shif t a pe u la
dreapta cu d + 1 − k p ozi¸tii, vom seta cel mai din dreapta bit cu 1 ¸si apoi vom shif ta numarul la stanga cu d + 1 − k p ozi¸tii. Amintim c˘ a aplicˆ and oper a¸tia S hif t la stanga ar ul x va fi deplasat cu p bi¸ti la stˆ cu p bi¸ti unui numar x, num˘ anga, iar la dr eapta a oper a¸tie corespunde ˆınmul¸tir ii numar ului bi¸tilor se vor adauga p bi¸ti 0. Aceast˘ cu 2 p . Aplicand oper a¸tia Shif t la dreapta cu p bi¸ti unui numar x, numarul x va fi deplasat cu p bi¸ti la dreapta, iar la stanga bi¸tilor se vor ad˘ auga p bi¸ti 0. Aceast˘ a oper a¸tie corespunde ˆım p˘ ar ¸tir ii numarului cu 2 p .
Toate oper a¸tiile pr ezentat e mai sus se pot ef ectua ın tim p constant. Deci ın urma unei preprocesari ın tim p liniar a unui arbore binar com plet, vom putea afla cel mai apr opiat str amo¸s comun pentru doua noduri ın com plexitat ea tim p O(1) ˆ
ˆ
ˆ
˘
ˆ
E xe m p lu: Vom calcula cel mai apropiat str amo¸s comun pentru nodurile 3 ¸si 5 din arborele pr ezentat ın figur a 3.7. Etichetele asociate acestor noduri sunt (0011) ¸si (0101). Aplicandu-le oper a¸tia XOR vom ob¸tine valoarea (0110). O bser vam ca bit ul 1 aflat cel mai ˆ
˘
˘
˘
la stanga se afla tia k = 2. Vom avea d + 1 − k = 3 + 1 − 2 = 2. Deplasam pe 3 ˘ pe p ozi¸ (0011) la dreapta cu 2 bi¸ti ¸si vom ob¸tine (0000). Set˘ and am cel mai din dreapta bit 1, ob¸tinˆ (0001) ¸si deplasam noul numar ob¸tinut cu 2 bi¸ti la stanga. Vom ob¸tine (0100), etichet a cor es pun zatoar e nodului 4, acest a fiind cel mai apropiat str amo¸s comun al nodurilor 3 ¸si 5.
Ca pitolul 4
Echivalen¸ta RM Q
−
LC A
Acest capit ol este dedicat d emonstr ar ii echivalen¸tei problemelor RM Q ¸si LC A. Vom
a reducem ˆın tim p liniar mai pr ezenta algor itmi ¸si structuri de date care ne vor ajuta s˘ ıntai problema LC A la problema RM Q ± 1, iar apoi problema RM Q la LC A. Utilizand reducerea problemei LC A la problema RM Q ± 1, putem oferi o solu¸tie ce pr e pr oceseaz˘ a
ˆ
arborele ˆın tim p liniar ¸si of er ˘ a raspunsuri la query-urile LC A ˆın tim p constant.
4.1
Reducerea problemei LC A la problema RM Q
Pentru a reduce problema LC A la problema RM Q vom folosi un tip special de par curgere a arborelui numit˘ a parcurgerea Euler. ˆInainte de a descrie reducerea ef ectiva, vom descrie mai amanun¸tit acest tip de par cur ger e.
a de a r e pr ezenta arbori intr o dus˘ a de Tarjan ¸si Vishk in Parcurgerea Euler este o metod˘ [9] ˆın 1984. Arborele est e vazut ca un graf orientat care, pentru fiecare muchie (u, v ) a arborelui, con¸tine dou˘ a muchii or ientat e: (u, v) ¸si (v, u). Astf el, arborele ar putea fi a un ciclu eulerian este un vazut ca un ciclu eulerian al unui graf orientat. Amintim c˘ drum ˆın graf care are ca nod de plecare ¸si de sosire acela¸si nod ¸si tr ece prin fiecare muchie exact o data. Tehnica de parcurgere Euler a unui arbore p er mite paralelizarea ¸si ast f el
optimizar ea mult or probleme din teor ia grafurilor. Tarjan ¸si Vishkin au propus o metod˘ de a constr uc¸tie ˆın paralel a parcurgerii Euler, ˆıns˘ a ˆın aceast˘ a lucrare vom pr ezenta o metod˘ a
liniara, paralelizarea nefiind de inter es ˆın acest context. Aceast˘ a parcurgere ar fi putea fi r ealizat˘ a liniar similar parcurgerii ˆın adancime, dif er en¸ta fiind c˘ a un nod va fi inserat ˆın parcurgere de fiecare dat ˘ a cand se revine din
r ecur sivitate la el. Practic orice nod-tat a va fi inserat ıntr e oricare doi fii ai sai. O bser vam ca dupa ce un nod a f ost inserat p r ima dat a ın parcurgere, parcurgerea va reveni la el de k ori, unde k este numarul de fii ai nodului. A¸sadar fiecare nod va apar ea ın par cur ger e de k + 1 ori. Presupunem ca un nodul i din arbore apare de k i + 1 ori ın par cur ger e, 1 ≤ i ≤ n. Cum arborele are n noduri ¸si n − 1 muchii, ob¸tinem: ˘
˘
˘
˘
ˆ
˘ ˆ
˘
˘
n X
ˆ
n X
k i = n + n
(k i + 1) = n + i=1
ˆ
−
1 = 2n − 1
i=1
A¸sadar lungimea parcurgerii Euler este 2n − 1. Vom r e¸tine ˆın vector ul E[ ] de dimensiune 2n − 1 nodurile din arbore ˆın ordinea ˆın care sunt par cur se. 42
Capitolul 4. Echivalen¸ta RM Q
− LC
A
Figura 4.1: Parcurgerea Euler a unui ar b or e ˆ
In figura de mai sus este pr ezentat arborele din figura 3.1 vazut c˘ a un graf or ientat am marcate pentru fiecare muchie a ar pe care se r ealizeaz˘ a parcurgerea Euler. O bser v˘ borelui cele dou˘ a muchii or ientat e ale grafului asociat. Pr ezentam ˆın continuar e vector ul E[ ] care pe p ozi¸tia i stocheaz˘ a al i-lea nod din parcurgerea Euler ¸si f unc¸tia r ecur siv˘ a care r ealizeaz˘ a parcurgerea. Aceast˘ a f unc¸tie f olose¸ste var iabil˘ a global˘ a S eqLeng th care r e pr ezint˘ a lungimea parcurgerii Euler la un moment dat al parcurgerii. Ini¸tial va tr e bui s˘ a ai b˘ am un nod la parcurgere o vom incr ementa. a valoarea 0 ¸si de fiecare dat ˘ a cˆ and ad˘ aug˘ La primul apel al f unc¸tiei, par ametr ului nod ˆıi vom asocia r ˘ b or elui. acina ar ad˘
Figura 4.2: Vector ul E aso ciat arb orelui din figura 4.1
Algor itmul 4.1: Calculul vector ului B EulerTour(E, nod) b egi n SeqLength = SeqLength + 1; E[SeqLength] = nod; foreach k son of nod do EulerTour(E, k ); SeqLength = SeqLength + 1; E[SeqLength] = nod;
Este evident ca parcurgerea Euler poate fi r ealizat a ın com plexitat ea tim p O(n). ˘
˘ ˆ
Capitolul 4. Echivalen¸ta RM Q
− LC
A
Vom reveni acum la descrierea metodei de reducere a problemei LC A la pr oblema RM Q. Pentru aceasta, vom avea nevoie de vect or ul E[ ] discutat mai sus ¸si de al¸ti tr ei vect or i:
- Level[ ] de dimensiune n ˆın care pe p ozi¸tia i vom r e¸tine nivelul nodului i ˆın ar b or e - L[ ] de dimensiune 2n − 1 ˆın care pe p ozi¸tia i vom r e¸tine nivelul celui de-al i-lea nod din parcurgerea Euler. Altf el spus L[i] = Lev el[E [i]] - H [ ] de dimensiune n ˆın care pe p ozi¸tia i vom r e¸tine p ozi¸tia primei apari¸tii a nodului i ın vector ul E. Pentru algor it mul pr ezentat ˆın continuar e, ˆın H putem r e¸tine p ozi¸tia
ˆ
oricarei apari¸tii a nodului ˆın E, dar vom alege s˘ am ˆıntotdeauna pe pr ima astr ˘ a o p˘
Este de remarcat f aptul ca ın vector ul L elementele consecutive dif er a exact cu o unitate. Acest lucru se dat or eaza f aptului ca aflandu-ne de-a lungul parcurgerii Euler la un nod u, putem sa continuam parcurgerea fie vizitand primul sau fiu nevizitat ınca (daca exist a, caz ın care ur mator ul element din vector ul L va fi cu o unitate mai mare), fie vom reveni la par intele sau (daca nu mai are fii nevizit a¸ti, caz ın care ur mat or ul element din L va fi cu o unitate mai mic). Aceast a car acter istica a vect or ului L este f oar te im p or tanta pentru ca putem raspunde la query-uri RMQ ın tim p constant ın urma unei pr e pr ocesar i a lui L ce necesit a com plexitatea tim p O(n). Pentru aceast a pr oblema f ost pr ezentat un algor itm ın sec¸tiunea 2.8 a acestei lucr ar i. ˘ ˆ
˘
˘
˘
ˆ
˘
ˆ
ˆ
˘
˘
ˆ
˘
ˆ
˘
˘
˘
˘
ˆ
ˆ
˘
˘
ˆ
˘
˘
Figura 4.3: Vector ii E, L ¸si H asocia¸ti arborelui din figura 4.1
Lema 4.1. LC A(u, v) = E [R M QL (H (u), H (v))]
Demon str a¸tie: Notam w = LC A(u, v), i = H (u) ¸si j = H (v). Presupunem ca i < j , deci nodul u apare ınaintea lui v ın parcurgerea Euler. Pentru a ajunge la nodul v , parcurgerea va tr e bui sa tr eaca ınt ai prin w, apoi va tr ece prin u, va reveni la w ¸si apoi va parcurge v, ıntr e acestea aparand evet ual ¸si alte noduri. Deci ıntr e p ozi¸tiile i ¸si j ın vect or ul E va aparea ¸si cel mai apropiat str amo¸s comun al nodurilor u ¸si v. Mai mult , acesta este chiar nodul cu cea mai mica adancime care apare ın inter valul [i, j ], p entr u ca parcurgerea nu poate urca la un str amo¸s al lui w f ar a sa viziteze ınt ai pe v. Deci w este nodul din parcurgerea Euler cu cea mai mica adancime aflat ıntr e p ozi¸tiile pr imelor apari¸tii ale nodurilor u ¸si v. Adica LC A(u, v) = E [R M QL (H (u), H (v))]. ˘
ˆ
ˆ
˘
˘ ˆ
ˆ
ˆ
˘
ˆ
ˆ
˘
˘
˘
˘
ˆ
˘
ˆ
ˆ
Capitolul 4. Echivalen¸ta RM Q
− LC
A
Constr uc¸tia vector ilor L ¸si H se va face ˆın acela¸si tim p cu constr uc¸tia vector ului E , deci pentru etapa de preprocesare a acestui algor it m vom avea com plexitatea tim p O(n).
Pentru etapa de raspuns, folosind lema de mai sus putem reduce un query LC A la un query RM Q ın tim p constant. Query-ul RM Q la care se face reducerea se ef ectueaza p e un vector care r es p ecta pr opr ietat ea ca dif er en¸ta ın modul ıntr e oricare doua elemente consecutive este exact 1, deci putem ob¸tine raspunsul la query ın tim p constant. A¸sadar ˆ
˘
˘
˘
ˆ
ˆ
˘
ˆ
com plexitat ea total˘ a a algor itmului pr ezentat este hO(n), O(1)i.
b or ele E xe m p lu: Pr ezentam mai jos pa¸sii ef ectua¸ti pentru a calcula LC A(10, 15) pe ar pr ezentat ın figura 4.1: ˆ
- Aflam prima p ozi¸tie pe care apare no dul 10 ˆın parcurgerea Euler: H [10] = 10 - Aflam prima p ozi¸tie pe care apare no dul 15 ˆın parcurgerea Euler: H [15] = 19 - Aflam p ozi¸tia minimului din inter valul [10, 19] din vect or ul L: 14 - Cel mai apropiat str amo¸s comun al nodurilor 10 ¸si 15 este E[14] = 3
Reducerea problemei RM Q la problema LC A
4.2
Pentru a reduce problema RM Q la problema LC A vom folosi o str uctur a de dat e ˘
ˆ
auxiliar a numita arbori car tezieni. Inainte de a descrie reducerea ef ectiva, vom descr ie acesta st r uctur a de date mai amanun¸tit . ˘
˘
˘
˘
˘
Arborii car tezieni au f ost intr o du¸si ˆın 1980 de c˘ atr e Vuillemin, care i-a denumit astfel dup˘ a sistemul de coordonate car teziene ˆın plan.
Un arbore car tezian este un ar b or e
binar derivat d intr -o secven¸t˘ a de numere, car acter izat de dou˘ a pr opr iet˘ a¸ti im p or tante:
pr opr ietat ea de heap ¸si pr opr ietat ea c˘ a fiind parcurs ˆın inordine vom ob¸tine secven¸ta de numere de la care arborele a f ost derivat. Cea mai im p or tant˘ a aplica¸tie a lor este ˆın problema RM Q, ˆıns˘ a au f ost f olosi¸ti ¸si ˆın definirea tr eap-ului (un arbore binar r andomizat care stocheaz˘ a o mul¸time dinamic˘ a de chei ¸si p er mite c˘ autar ea acestor a ˆın log(n)), iar ˆın 1989, Levcopoulos ¸si Peter sson au descris un algor it m de sor t ar e bazat pe arbori car tezieni.
Pr op r iet˘ a¸ti: - Un arbore car tezian asociat unei secven¸te de numere are cate un nod pentru fiecar e
numar din secven¸ta. - Parcurgand ˆın inordine un arbore car tezian, vom ob¸tine secven¸ta de numere asociat a.
at oar e nodurilor din subarborele stˆ Aceasta ˆınseamn˘ a c˘ a valorile cor es punz˘ ang apar ınaintea valorii din r adacin˘ a ˆın secven¸ta de numere, iar cele din subarborele dr e pt
ˆ
¸si pentru nodurile aflate apar dup˘ a valoarea din r adacina a ˘. O ordonare similar ˘ apare b or e. pe niveluri mai joase ˆın ar - Un arbore car tezian are pr opr ietatea de heap: p˘ ar intele oricarui nod are asociat˘ ao valoare mai mic˘ a decat valoarea asociat˘ a nodului.
Capitolul 4. Echivalen¸ta RM Q
− LC
A
Figura 4.4: Un vector de dimensiune 10 ¸si arborele car tezian asociat. ˆIn inter ior ul nodurilor am notat pozi¸tia din vector careia acestea corespund, iar ˆın dreapta nodului am notat valoarea de pe r es pectiva pozi¸tie.
Dat or it˘ a pr opr iet ¸tii de heap, ˆın r adacin˘ a vom avea cea mai mic˘ a valoare din secven¸ta.
Presupunem ˆın continuar e c˘ a avem stocat˘ a o secven¸t˘ a de n numere ˆın vector ul A[ ]. Observam c˘ a arborele car tezian asociat acesteia ar putea fi definit recursiv astf el: - ˆIn r adacin˘ a vom avea cel mai mic element din secven¸t˘ a. Presupunem c˘ a acesta se afl˘ a pe pozi¸tia i - ˆIn subarborele stang vom avea valorile din st anga r ad˘ acinii: A[0 . . . i − 1] - ˆIn subarborele drept vom avea valorile din dreapt r ad˘ acinii: A[i + 1 . . . n − 1]
Trebuie remarcat c˘ a dac˘ a ˆın secven¸t˘ a apar numere egale, atunci arborele car tezian asociat nu este unic. Pentru a rezolva aceast˘ a problema, dac˘ a pe un inter val [i, j ] din secven¸t˘ a valoarea minim˘ a apare de mai multe ori, atunci vom considera pozi¸tia pr imei apari¸tii a sa ca fiind pozi¸tia minimului pe r es pectivul inter val. ˆIn continuar e, vom r e¸tine ın nodurile arborelui p ozi¸tiile asociate elementelor din secven¸ta ¸si nu valorile ef ective.
ˆ
C on str u c¸tia arborilor car tezien i: Avand dat vector ul A cu n elemente, arborele car tezian C asociat poate fi constr uit ın tim p liniar folosind ca str uct ur a de date auxiliar a o stiva. Fie S tack [ ] aceast a stiva. Ini¸tial va fi vida. La fiecare pas al algor itmului vom parcuge un element al secven¸tei ¸si vom adauga ın stiva p ozi¸tia sa ın secven¸ta. La pasul i vom avea constr uit arborele car tezian cor es pun zat or primelor i elemente din secven¸ta. La pasul i + 1 va tr e bui sa inseram no dul i + 1, astf el ıncat noul arbore ob¸tinut sa fie arborele car tezian asociat secven¸tei f ormate din primele i + 1 numere. Va tr e bui sa ıi gasim p ozi¸tia ın arbore ast f el ıncat nodul tata sa ai ba o valoare asociat a mai mica decat valoarea asociat a nodului. Putem face acest ˆ
˘
ˆ
˘
ˆ
˘
˘
˘
˘
˘
ˆ
˘
˘
˘ ˆ
˘
˘
˘
˘
˘
ˆ
ˆ
˘
ˆ
˘
˘
Capitolul 4. Echivalen¸ta RM Q
− LC
A
lucru sco¸tand din stiv˘ a elemente pan˘ a cand ajungem la un nod care are valoarea asociat˘ a
am arborelui. Notam cu mai mic˘ a-l ad˘ a decat valoare asociat˘ a nodului pe care dorim s˘ aug˘ k acest nod ¸si cu p fiul sau drept (dac˘ a exista). Nodul k va fi tatal nodului cur ent, iar fiul drept al lui k va deveni nodul cur ent. Vechiul fiu drept al lui k va deveni fiul stˆ ang al nodului cur ent . Ultima modificare pr ezentat ˘ a este cor ect˘ a pentru c˘ a toate elementele aflate ˆın arbore se afl˘ a la stanga nodului cur ent ¸si vechiul nod al lui k are valoarea asociat˘ a mai mare decat valoarea asociat˘ a nodului cur ent (altf el ne-am fi opr it la el atunci cand am scos din stiva).
Este de remarcat f aptul ca la fiecare pas primul element din stiva va fi radacina ar borelui constr uit pana acum, iar ınaintand spre var fu l stivei vom gasi noduri cu valor i asociate ordonate cr escat or . ˘
˘
˘
ˆ
ˆ
ˆ
˘
Vom pr ezenta ˆın continuar e pa¸sii de constr uc¸tie ai arborelui car tezian din figura 4.4.
Pas
Stiv˘ a
0
0
1
0 1
Modificari asupra stivei/ar b or elui ˆ
In arbore avem un singur nod: 0
A[1] > A[0], deci vom adauga nodul 1 ˆın varful stivei. Acest a va deveni fiul drept al nodului 0
2
2
A[2] este mai mai mic decˆ at valorile de pe toate pozi¸tiile din stiva. Va scoate deci toate elementele din stiv˘ a ¸si va deveni
radacina arborelui. Nodul 0 va deveni fiul s˘ au stang 3
3
A[3] < A[2], deci nodul 2 va ie¸si din stiva. Nodul 3 va deveni
r adacina a arborelui, iar 2 va deveni fiul sau stang ˘
4
3 4
ˆ
A[4] > A[3], deci vom adauga nodul 4 ˆın varful stivei. Acest a va deveni fiul drept al nodului 3
5
3 4 5
A[5] > A[4], deci vom adauga nodul 5 ˆın varful stivei. Acest a va deveni fiul drept al nodului 4
6
3 4 6
A[6] < A[5], deci vom scoate nodul 5 din stiv˘ a. Nodul 6 va deveni fiul drept al lui 4, iar 5 va deveni fiul st ang al lui 6
7
3 4 7
A[7] < A[6], deci vom scoate nodul 6 din stiv˘ a. Nodul 7 va deveni fiul drept al lui 4, iar 6 va deveni fiul st ang al lui 7
8
3 8
Nodul 8 va scoate toate elementele din stiv˘ a, mai pu¸tin nodul 3 pentru c˘ a A[3] = A[8]. Nodul 8 va deveni fiul drept al lui 3, iar 4 va deveni fiul st ang al lui 8
9
3 8 9
A[9] > A[8], deci vom adauga nodul 9 ˆın varful stivei. Acest a va deveni fiul drept al nodului 8
Capitolul 4. Echivalen¸ta RM Q
− LC
A
Pr ezentam ın continuar e f unc¸tia care constr uie¸ste arborele car tezian r e pr ezentat ca un vect or ın care sunt re¸tinute legatur ile fiu-tata. Vom r e¸tine ın memorie vector ul P ar ent[ ] b or e. de dimensiune n ın care pe p ozi¸tia i vom r e¸tine tat al nodului i din ar ˆ
ˆ
˘
ˆ
ˆ
˘
Algor itmul 4.2: Algor itm de constr uc¸tie a unui arbore car tezian BuildCar t ezianTr ee( A, Parent, n) b egi n Top = −1; for i ←− 0 to n − 1 do k = Top;
˘ // scoatem noduri din stiva while k ≥ 0 and A[i] < A[S tack [k ]] do k = k − 1;
// actualizam tatal nodului curent if k ≥ 0 then Par ent [i] = Stack [k ];
// actualizam tatal vechiului fiu drept cu nodul curent if k < T op th en Par ent [St ack [k + 1]] = i;
// inseram nodul curent
ı^n stiv
k = k + 1; Stack [k ] = i; Top = k ;
// ini¸ializam radacina arborelui Par ent[Stack [0]] = −1;
Observam c˘ a fiecare nod al arborelui este adaugat ˆın stiv˘ a o singur a a ¸si poate fi ˘ dat ˘ scos de un alt nod cel mult o data ˘. Deci constr uc¸tia arborelui va avea com plexitatea tim p O(n).
Lema 4.2. RM QA (i, j) = LC AC (i, j )
Demon str a¸tie: Vom nota cu k cel mai apropiat str amo¸s comun al nodurilor i ¸si j ın arborele car tezian C. Drumurile de la r adacina la cele doua noduri au muchiile comune pana la nodul k, apoi se des par t. Avem doua cazur i: ˘
˘
˘
ˆ
˘
˘
- Cel mai apropiat st r amo¸s comun al lui i ¸si j este unul dintr e acestea doua P r e˘. supunem c˘ at toate valorile asociat e a este i. Atunci valoarea A[i] va fi mai mic˘ a decˆ nodurilor din subarborele care ˆıl include pe j dat or it˘ a pr opr iet ¸tii de heap a ar b or elui. Deci RM QA (i, j) = LC AC (i, j ). - Cel mai apropiat str amo¸s comun al lui i ¸si j este dif er it de acestea dou˘ a. Atunci unul
dintr e noduri se va afl˘ a ˆın subarborele stˆ ang al lui k, iar celelalt ˆın subarborele dr e pt. Presupunem c˘ a i se afl˘ a ˆın subarborele stang ¸si j ˆın subarborele drept. A¸sadar, A[i] se va afl˘ a la stanga elementului A[k], iar A j a la dreapta. Deci k se afl˘ a ˆın [ ] se va afl˘ inter valul [i, j ]. Mai mult chiar, A[k] este cea mai mic˘ a valoare din inter valul [i, j ].
a exist˘ a k ′ = k ˆın inter valul [i, j ] astf el ˆıncat A[k ′ ] < A[k], ar Presupunand c˘ r ezulta
Capitolul 4. Echivalen¸ta RM Q
− LC
A
ar ¸ti drumurile de la r ˘ c˘ acin˘ a k ′ este primul nod care va des p˘ ad˘ a la nodurile i ¸si a nodul care des par te aceste drumuri este chiar k . j . Dar ¸stim c˘ Cu alte cuvinte k se afl˘ acin˘ la a ˆın inter valul [i, j ] pentru c˘ a des par te drumurile de la r ˘ ad˘ a cele dou˘ a noduri ¸si A[k] este minim deoarece k este primul nod care le des par te. Deci RM QA (i, j) = LC AC (i, j ). Utilizand aceast˘ a lema, putem reduce ˆın tim p constant un query RM Q pe un vector oarecare la un query LC A pe arborele car tezian asociat, ef ect uˆ and anter ior o pr e pr ocesar e
b or ece necesit˘ a com plexitatea tim p O(n). Preprocesarea const˘ a de f apt ˆın constr uir ea ar lui car tezian.
¸ tim ca problema LC A pe arborele car tezian se poate reduce la o pr obC on secin¸ t˘ a: S lema RM Q ± 1 ın tim p liniar. Astf el putem reduce problema RM Q la versiunea ei sim plificat a ın tim p liniar. Utilizand aceaste doua reduceri consecutive, putem oferi o solu¸tie cu com plexitat ea tim p totala hO(n), O(1)i pentru pr oblema RM Q. ˘
˘
ˆ
˘ ˆ
˘
˘
bor e car tez ian Ar
˘
P arcurgere E uler
−−−−−−−−−− → LC A −−−−−−−−−−−→ RM Q ± 1 RM Q −
Ca pitolul 5
A plica¸ tii ale problemei LC A Acest capitol este dedicat st udiului unor probleme mai complexe pe arbori ce f olosesc
Inainte de a descrie ˆın detaliu aceste ca pas inter mediar ˆın rezolvarea lor problema LC A. ˆ probleme ¸si solu¸tiile pentru ele, vom face face o scur ta pr ezentar e a lor .
Presupunem dat un arbore T cu n noduri ın care fiecar ui nod ıi asociem o valoar e numita pondere a nodului. Definim no¸tiunea de lan¸t elementar ıntr e doua noduri x ¸si y astf el: L = (x0 , x1 , . . . xn ), unde x0 = x, xn = y ¸si x i = x j , ∀i = j ˆ
˘
˘
ˆ
ˆ
˘
ˆ
In continuar e vom folosi ter menul de lan¸t , dar ˆıntotdeauna ne vom referi la un lan¸t ar ul de noduri pe care element ar . Vom considera c˘ a lungimea unui lan¸t este dat ˘ a de num˘ le con¸tine. ˆ In acest capitol vom studia modalit ¸ti de prelucrare a unui arbore cu ponderi asociat e nodurilor pentru a putea calcula eficient suma ¸si valoarea minim˘ a/m axim˘ a de pe un lan¸t element ar .
Trebuie notat f aptul ca solu¸tiile pr ezentate ın continuar e pot fi f oar te u¸sor modificate pentru a afla suma ¸si valoarea minima/m axima de pe un lan¸t elementar al unui arbore care are ponderi asociate muchiilor ¸si nu nodur ilor . Vom st udia problemele descrise mai sus ın doua cazur i: ˘
ˆ
˘
ˆ
˘
˘
- Arborele este static, adica a pe parcursul algor it˘ ponderile nodurilor nu se mo dific˘ mului - Arborele este dinamic, adic˘ a vom avea dou˘ a tipuri de oper a¸tii pe arbore: - query, ˆın care se solicit˘ a/m axim˘ a suma sau valoarea minim˘ a pe un lan¸t - act ualizar e, ˆın care se modific˘ a ponderea unui nod
Pe parcursul ˆıntr egului capitol la calcularea com plexit˘ a¸tilor tim p vom presupune c˘ a pentru problema LC A avem com plexitatea O(n) pentru preprocesarea arborelui ¸si O(1)
pentru raspunsul la un query.
5.1
Problema sumei pe un arbore static
Presupunem c˘ a ni se cere suma ponderilor nodurilor unui lan¸t (u, v) din arbore ˆın context ul ˆın care nu se modific˘ a ponderi ale nodurilor. Vom nota ˆın continuar e aceast˘ a
50
Capitolul 5. Aplica¸tii ale ale problemei LC A
51
valoare cu Sum(u, v) ¸si cu w cel mai apropiat str amo¸s comun al lui u ¸si v. Evident w se afl˘ a pe lan¸tul dintr e u ¸si v. Pentru a calcula suma pe acest lan¸t vom ”descompune” lan¸tul
ın dou˘ a lan¸turi mai mici: lan¸tul de u la w ¸si lan¸tul de la w la v. Ne ramane acum de
ˆ
calculat suma pe un lan¸t de la un nod la un str ˘ amo¸s al s˘ au. Fie y un nod oarecare din arbore ¸si x un str amo¸s al sau. Calculul sumei pe lan¸tul dintr e aceste noduri s-ar putea realiza f oar te u¸sor par cur gˆ at ur ile fiuand lan¸tul prin leg˘ tata plecand din nodul y pan˘ a la nodul x. ˆIns˘ a astf el am avea com plexitat ea tim p O(n) pentru un query ˆın cel mai defavorabil caz. Vom pr ezenta ˆın continuar e o metod˘ a de calcul a sumei cautate ˆın com plexitatea tim p O(1). Aceast˘ a metod˘ a calculeaz˘ a suma pe lan¸tul dintr e cele noduri ca dif er en¸ta dintr e suma pe lan¸tul dintr e r adacin˘ acin˘ a ¸si y ¸si suma pe lan¸tul dintr e r ad˘ a ¸si nodul x. A¸sadar va tr e bui nod suma pe lan¸tul de la r ˘ acin˘ sa ad˘ a la nodul r es pectiv. Vom ˘ calculam pentru fiecare
r e¸tine aceasta valoare ın vector ul S[ ] de dimensiune n. Pentru calcularea lui vom utiliza o parcurgere ın adancime a arborelui. Func¸tia care r ealizeaza parcurgerea ın adancime va avea doi par ametr i: nodul cur ent ¸si suma de pe lan¸tul de la r adacina pana la tat al nodului cur ent . Vom apela f unc¸tia de parcurgere dand ca prim par amet r u radacina arborelui, iar pentru al doilea vom da valoarea 0. Pentru fiecare nod: ˘
ˆ
ˆ
˘
ˆ
˘
˘
ˆ
˘
ˆ
- Ini¸tializam valoarea de pe p ozi¸tia cor es punz˘ at oar e din S cu suma de pe lan¸tul de la
r adacina pana la tatal nodului cur ent la care vom adauga ponderea nodului cur ent ˘
˘
- Apelam f unc¸tia pentru to¸ti fiii avˆ and ca cel de-al doilea par ametr u suma de pe lan¸tul de la r adacin˘ a la nodul cur ent
Figura 5.1: Sum(5,11) = 17 ˆ
In figura de mai sus am pr ezentat un arbore oarecare pentru care se cere suma p e am c˘ lan¸tul (5,11). Am notat lang fiecare nod ponderea as ociat˘ a acestuia. O bser v˘ a lan¸tul (5,11) se descompune ˆın lan¸tur ile (5,3) ¸si (3,11).
Capitolul 5. Aplica¸tii ale ale problemei LC A
52
Pr ezentam mai jos f unc¸tia r ecur siva care constr uie¸ste vector ul S. Vom folosi atat ın f unc¸tia de mai jos, cat ¸si ın sec¸tiunile ur matoar e vector ul W eig ht[ ] de dimensiune n ın care vom r e¸tine ponderile nodurilor din ar b or e. ˘
ˆ
ˆ
˘
ˆ
Algor itmul 5.1: Constr uc¸tia vector ului S Df s(Weight, nod, Sum) b egi n Sum = Sum + Weight[nod]; S[nod] = Sum; foreach son k of nod do Df s(Weight, k, Sum);
Observam ca pe lan¸tul (u, v) ca mai jos (u si v sunt dou˘ a nodur i ˘ putem scrie suma oarecare, iar w este cel mai apropiat st r amo¸s comun al lor ): − + S[u] S[w] S[v] − S[w] Sum(u, v) = + W eight[w] | | {z } {z } suma pe pr ima par te a lan¸ tului suma pe a doua parte a lan¸tului
= S[u] + S[v] − 2 · S[w] + W eig ht[w] Etapa de preprocesare a arborelui consta ın parcurgerea ın adancime prin care construim vector ul S ¸si preprocesarea arborelui pentru a putea raspunde query-urilor LC A, deci vom avea com plexitatea tim p O(n). Pentru etapa de raspuns este evident ca avem com plexitat ea O(1): cel mai apropiat str amo¸s comun al nodurilor poate fi calculat ın tim p constant ¸si pe baza acest uia putem calcula suma pe lan¸tul dat folosind formula de mai sus. ˘ ˆ
ˆ
ˆ
˘
ˆ
5.2
Problema sumei pe un arbore dina mic
Problema aflarii sumei pe un lan¸t (u, v) devine mult mai inter esant˘ b or ele a dac˘ a ar este dinamic. ˆIn acest caz ponderile nodurilor se pot modifica. ˆ Incer cand s˘ a adaptam metoda utilizat ˘ a anter ior pentru arborele static, vom ob¸tine com plexitatea tim p O(n) ˆın cel mai defavorabil caz pentru actualizar ea arborelui. Pr actic, la o oper a¸tie de modificar e a ponderii unui nod va tr e bui s˘ acina la nodul a modificam at ˆat suma pe lan¸tul de la r ˘ ad˘ r es pectiv, cat ¸si suma pe lan¸tur ile de la r ˘ b or ele acin˘ ad˘ a la toate nodurile aflate ˆın subar care are ca r adacin˘ a nodul cur ent. Am putea face acest lucru astf el: - Calculam suma pe lan¸tul dintr e r ˘ acin˘ ad˘ a ¸si nodul cur ent dup˘ a ur matoar ea f ormula: S[nod] = S[nod] − x + y unde nod este nodul cur ent , x este vechea pondere a nodului ¸si y este noua ponder e a acest uia
unc¸tia - Parcurgem doar subarborele care are ca r ˘ acin˘ ad˘ a nodul cur ent, apela ˆnd f descr is˘ a ˆın sec¸tiunea anter ioar ˘ a cu nodul cur ent ca prim par ametr u ¸si suma calculat ˘ a pentru acesta ca al doilea par ametr u
Capitolul 5. Aplica¸tii ale ale problemei LC A
53
Se obser v˘ a c˘ a pentru o actualizar e a r ˘ adacinii arborelui, ˆıntr egul vector S va fi modificat ¸si ˆın acest caz vom avea com plexitat ea O(n). Vom pr ezent a ˆın continuar e o solu¸tie care f olose¸ste arbori de inter vale ca str uctur ˘ a de date auxiliar ˘ a ¸si cu a jutor ul careia putem ob¸tine com plexitat ea tim p O(log(n)) atat pentru oper a¸tia de inter ogar e, cˆ at ¸si pentru cea de actualizar e.
b or elui. Solu¸tia descr is˘ a ˆın continuar e va mai folosi o tehnic˘ a numit˘ a liniarizarea ar
Este o alta f orma de r e pr ezentar e a arborelui, similar a r e pr ezentar ii Euler. Vom constr ui acesta r e pr ezent ar e pr int r -o parcurgere ın adancime a arborelui. Fiecare nod va fi intr o dus ın secven¸ta de noduri ce r e pr ezint a liniarizarea atunci cand parcurgerea viziteaza nodul s¸i ınainte ca parcurgerea sa par aseasca nodul (adica dup a ce au f ost vizit a¸ti to¸ti fiii sai). Observam ca fiecare nod apare ın secven¸ta de 2 ori, deci lungimea secven¸tei va fi 2n. Vom r e¸tine secven¸ta ın vector ul Seq[ ] de dimensiune 2n. ˘
˘
˘
ˆ
ˆ
˘
ˆ
˘
˘
˘
˘
˘
˘
˘
˘
˘
ˆ
ˆ
Pentru rezolvarea problemei sumei pe un arbore dinamic va tr e bui sa mai r e¸tinem ın memorie trei vect or i: ˘
ˆ
- SP [ ] de dimensiune 2n ˆın care pe p ozi¸tia i vom r e¸tine: - ponderea nodului aflat pe p ozi¸tia i ˆın r e pr ezent ar ea liniar ˘ a a arborelui, dac˘ a p e aceast˘ a p ozi¸tia este r e¸tinut˘ a prima sa apar i¸tie ˆın liniar izar e - ponderea cu semn schimbat a nodului aflat pe pozi¸tia i ˆın r e pr ezentar ea liniar ˘ a a arborelui, dac˘ a pe aceast˘ a pozi¸tie este r e¸tinut˘ a a doua sa apar i¸tie ˆın liniar izar e - F ir stP os[ ] de dimensiune n ˆın care pe p ozi¸tia i vom r e¸tine p ozi¸tia primei apar i¸tii
b or elui a nodului i ˆın r e pr ezentar ea liniar ˘ a a ar - LastP os[ ] de dimensiune n ˆın care pe p ozi¸tia i vom r e¸tine p ozi¸tia celei de-a doua
apari¸tii a nodului i ın r e pr ezentar ea liniar a a ar b or elui ˆ
˘
Figura 5.2: Vector ii Seq, SP, F irstP os, Last P os asocia¸ti arborelui din figura 5.1
am arborele. Atunci cˆ am Ace¸sti vect or i pot fi constr ui¸ti atunci cˆ and liniar iz˘ and ad˘ aug˘ un nod x la liniarizare, vom adauga ¸si valoarea cor es punzatoar e ˆın vector ul SP .
De
asemenea, vom ini¸tializa p ozi¸tia x din vector ul F ir stP os (dac˘ a nodul este adaugat pentr u prima dat˘ a la liniarizre) sau LastP os (dac˘ a nodul apare a doua oar ˘ a ˆın liniarizare) cu
p ozi¸tia cur ent˘ a din liniar izar e.
Capitolul 5. Aplica¸tii ale ale problemei LC A
54
Pr ezentam mai jos f unc¸tia r ecur siva care constr uie¸ste ace¸sti arbori. Aceasta f unc¸tie f olose¸ste variabila globala S eqLeng th care desemneaza lungimea liniar izar ii la un moment dat al parcurgerii. Ini¸tial va fi 0 ¸si la fiecare adaugar e a unui nod la liniarizare, vom incr ement a lungimea sa. La primul apel al f unc¸tiei vom da ca valoare p ent u par ametr ul b or elui. nod radacina ar ˘
˘
˘
˘
˘
Algor itmul 5.2: Constr uc¸tia vector ilor Seq, SP, F ir stP os, LastP os . Df s(Weight, nod) b egi n SeqLength = SeqLength+1; Secv[SeqLength] = nod; SP[SeqLength] = Weight[nod]; Fir stPos[nod] = SeqLength;
foreach son k of nod do Df s(Weight, k ); SeqLength = SeqLength+1; Secv[SeqLength] = nod; SP[SeqLength] = −Weight[nod]; LastPos[nod] = SeqLength;
O bser va¸tia 5.1. Vectorul SP este construit ˆın a s ¸a fel ıncat atunci cand un subarbore cu ˆ
r ad acina ˆın x este parcurs ˘ ˘
ın ˆ
ı
ˆ
ˆ
nt re gime ponderile sale se anul ea z a. Altfel s pu s
ˆ
˘
LastP os[x] X
SP [i] = 0
δ = i=F irstP os[x]
Aceast˘ am un a pr opr ietate a vector ului SP r ezult˘ a din f aptul c˘ a atunci cˆ and ad˘ aug˘
nod la liniarizare ˆın vector ul SP ad˘ asim nodul adaug˘ ar ˘ aug˘ and p˘ am ponderea, iar cˆ am ponderea sa cu semn schimbat. Par cur gˆ and un subarbore, pentru fiecare nod vom adauga la vizitar ea lui ponderea, iar la ie¸sir ea din nod ponderea cu semn schimbat, deci ˆınsumand elementele din vect or ul SP
ıntr e p ozi¸tiile primei apari¸tii ¸si ultimei apari¸tii a r ad˘ acinii
ˆ
subarborelui vom obt¸ine ca rezultat valoarea 0. O alt˘ a pr opr ietate a vector ului SP care r ezult˘ a din obser va¸tia anter ioar ˘ a este c˘ a suma valorilor din vector ul SP este 0.
Lema 5.1. Fie x un st ra mo s ¸ al lui y . At unci ˘
F irstP os[y] X ∆
X
SP [i] =
= i=F irstP os[x]
W eig ht[z ], unde L = (x0 , x1 , . . . xn ), x0 = x, xn = y z ∈L
Cu alte cuvinte, suma valorilor din vectorul SP nodurilor x ¸si y
ˆ ın
dintre po z i ¸t iil e primelor apar i ¸ti i al e
liniarizarea arborelui este e gal a cu suma ponderilor nodurilor de pe ˘
l an ¸t ul dintre x ¸si y.
Demon str a¸tie: Avem lan¸tul L = (x0 , x1 , . . . xn ), x0 = x, xn = y. Dupa ce nodul x a f ost intr o dus ın r e pr ezent ar ea liniar a pentru prima dat a, parcurgerea va decurge astf el: ˘
ˆ
˘
˘
Capitolul 5. Aplica¸tii ale ale problemei LC A
55
- Vor fi parcur¸si to¸ti subarborii care au ca r ad˘ acin˘ a fii ai lui x0 = x pan˘ a cand se
Par cur gand ın ıntr egime ace¸sti subarbori, conform obser va¸tiei anter ioar e, ın vector ul SP ponderile cor es pun zatoar e nodurilor din ajunge la nodul x 1 , fiu al lui x0 .
ˆ
ˆ
ˆ
ˆ
subarbore se vor anula. - Nodul x1 va fi intr odus pentru prima dat ˘ a ˆın r e pr ezentar ea liniar ˘ a a arborelui, deci ın vect or ul SP vom adauga ponderea sa. Vom parcurge to¸ti subarborii care au ca r adacin˘ a fii ai lui x1 pan˘ a cand ajungem la nodul x2 , fiu al lui x1 . Valorile din S P
ˆ
asociate nodurilor din ace¸sti subarbori se vor anula.
Parcurgerea se va desf ˘ a¸sur a similar pˆ an˘ a la intr oducer ea ˆın r e pr ezentar ea liniar ˘ a a nodului y. Observam ca t apar o singur ˘ a dat ˘ a ˆın r e pr ezentar ea liniar a, ˘ nodurile de pe lan¸
ar ea de dou˘ pe cand celelalte noduri parcurse vor ap˘ a ori, deci valorile lor asociate din vect or ul SP se vor anula. A¸sadar, suma valorilor din vector ul SP ˆıntr e p ozi¸tiile pr imelor
apari¸tii ale nodurilor x ¸si y este exact suma ponderilor de pe lan¸tul (x, y ).
E xe m p lu: Sa studiem cum putem ob¸tine suma valorilor pe lan¸tul (3,11) utilizand vect or ul SP . Avem F ir stP os[3] = 6 ¸si F ir stP os[10] = 17. Deci vom st udia valor ile din vect or ul SP aflate pe p ozi¸tiile dintr e 6 ¸si 17. Observam ca ın acest inter val p entr u nodurile 3, 7, 10 ¸si 11 apar ın SP doar ponderile sale, pe cand pentru nodurile 5, 6, 8 ¸si 9 apar atat ponderile, cat ¸si ponderile cu semn schimbat, ”anuland” astf el apari¸tia acestor noduri ın liniarizare. Calculand, ob¸tinem suma valorilor din SP pe inter valul [6, 17] egala cu 15. Se poate observa pe arborele din figura 5.1 ca aceast a este valoarea cautat a. ˘
˘ ˆ
ˆ
ˆ
ˆ
˘
˘
˘
Figura 5.3: Calculul sumei pe lantul (3,11)
Mai sus am reluat vector ul SP , precizand sub el ¸si caror noduri le corespund valor ile din SP . Observam marcat inter valul pe care dorim s˘ a calculam suma ¸si cei trei subar bori ale caror ponderi se anuleaza: subarborele cor es punz˘ at or frunzei 5, subarborele cu
radacina ˆın nodul 6 ¸si subarborele cor es punzator frunzei 9.
Pentru a calcula suma pe lan¸tul (u, v), unde u ¸si v sunt doua noduri oarecare din arbore, vom ım par ¸ti lan¸tul ın doua lan¸turi mai mici: (u, w) ¸si (w, v), unde w este cel mai apropiat str amo¸s comun al nodurilor u ¸si v. Nodul w este str amo¸s pentru ambele nodur i, deci vom putea calcula suma pe cele doua lan¸turi utilizand vector ul SP . O pr ima meto dar fi sa parcurgem vect or ul SP de la p ozi¸tia primei apari¸tii a nodului w pana la pr ima p ozi¸tie a nodului u ın r e pr ezentar ea liniar a a arborelui. Vom proceda similar pentru a afla suma pe lan¸tul (w, v). Observam ca aplicand aceast a metoda vom avea com plexitatea tim p O(n) pentru a raspunde la un query. Am putea ım bunat ¸ti com plexitatea tim p ˘
ˆ
ˆ
˘
˘
ˆ
˘
˘
˘
˘
ˆ
˘
˘
ˆ
˘
˘
ˆ
e¸ folosind un arbore de inter vale ˆın care sa tinem sumele valorilor pe anumite inter vale ˘ r
din vector ul SP .
Capitolul 5. Aplica¸tii ale ale problemei LC A
56
Am pr ezentat arborii de inter vale ˆın detaliu ˆın sec¸tiunea 2.7 a acestei lucrari. ˆ In acea
at oar e nodurilor. De aceast˘ sec¸tiune pastr am ˆın arbore minimul pe inter valele cor es punz˘ a dat˘ a ˆınsa, vom pastra ˆın noduri suma pe inter vale. Modul de im plementar e este f oar te similar ¸si de aceea vom folosi ˆın continuar e f unc¸tiile de constr uc¸tie a arborelui de inter vale, de actualizar e a unui element ¸si de inter ogar ea a valorii pe un inter val f ar ˘ a a mai detalia im plemetar ea lor. R eamintim ca uc¸tie aveam com plexitatea tim p O(n), iar ˘ pentru const r
pentru modificarea unei valori sau inter ogar ea valorii pe un inter val O(log(n)), unde n b or ele. este lungimea vect or ului pentru care constr uim ar Vom avea deci ˆın etapa de preprocesare a arborelui mai mul¸ti pa¸si: - Vom preprocesa arborele pentru a putea r ˘ as pund e query-urilor LC A. Pentru acest pas avem com plexitatea tim p O(n). - Calculam vect or ii Seq, SP , F ir stP os, LastP os utilizand o parcurgere ˆın adˆ ancime.
S ¸ i pentru acest pas vom avea com plexitat ea tim p O(n). - Const r uim arborele de inter vale pentru vector ul SP . Lungimea lui SP este 2n, deci constr uc¸tia arborelui va avea com plexitat ea tim p O(n).
Observam c˘ a vom avea com plexitat ea total˘ a O(n) pentru etapa de preprocesare.
Pr ezentam ın continuar e pa¸sii necesari pentru a r as punde la un query care solicit suma pe un lan¸t (u, v) din arbore: ˆ
˘
- Calculam cel mai apropiat str ˘ amo¸s comun al lui u ¸si al lui v. Fie acest nod w. Pentr u aflarea lui vom avea com plexitatea tim p O(1). - Calculam primele p ozi¸tii pe care apar ˆın vect or ul SP nodurile u, v ¸si w. Avand
precalculat vector ul F ir stP os putem afla aceste valori ˆın tim p constant. Notam - i = F ir stP os[w] - j = F ir stP os[u] - k = F ir stP os[v] - Vom putea calcula suma pe lan¸tul (u, w) pr intr -o inter ogar e a arborelui de inter vale a
b or ele sumei pe inter valul [i, j ]. Analog vom afla suma pe lan¸tul (w, v), inter ogˆ and ar pe inter valul [i, k]. Pentru aceste oper a¸tii vom avea com plexitatea tim p O(log(n)). - Vom calcula suma pe lan¸tul (u, v) utilizˆ and ur matoar ea f ormula:
Sum(u, v) = Sum(u, w) + Sum(w, v)
−
W eight[w ]
Com plexitat ea total˘ a pentru a raspunde la un query va fi O(log(n)).
E xe m p lu: Dorim sa calculam suma pe lan¸tul (5,11) din arborele din figura 5.1. Calculam LC A(5, 11) = 3 ¸si p ozi¸tiile pe care apar prima dat a ın r e pr ezentar ea liniar a no dur ile 3, 5 ¸si 11: F ir stP os[3] = 6, F ir stP os[5] = 7, F ir stP os[11] = 17. Vom calcula: ˘
˘
˘ˆ
˘
- Suma pe prima parte a lan¸tului inter ogˆ and arborele de inter vale pentru inter valul [6,7]: Sum(5, 3) = 3
Capitolul 5. Aplica¸tii ale ale problemei LC A
57
- Suma pe a doua parte a lan¸tului inter ogˆ and arborele de inter vale pentru inter valul [6,17]: Sum(3, 11) = 15 Suma pe lan¸tul (5,11) va fi Sum(5, 11) = Sum(5, 3) + Sum(3, 11) − W eight[3] = 17.
amo¸s comun tr e buie sc˘ Remarcam c˘ azut˘ a ponderea celui mai apropiat str ˘ a deoarece acest nod apare atat ˆın primul lan¸t, cat ¸si ˆın al doilea lan¸t. Actualizar ea ponderii unui nod x al arborelui va necesita modificarea vector ilor W eig ht,
SP ¸si a arborelui de inter vale. ˆIn vector ul W eight vom modifica al x-lea element, In vector ul SP ponderea nodului x ini¸tializand valoarea acestuia cu noua pondere a nodului. ˆ va aparea de dou˘ a ori: pe prima pozi¸tie pe care apare nodul x ˆın r e pr ezentar ea liniar ˘ a a arborelui ¸si cu semn schimbat pe ultima p ozi¸tie pe care apare nodul x. Va tr e bui s˘ a
b or elui modificam aceste p ozi¸tii ˆın SP ¸si s˘ a ef ectuam dou˘ a oper a¸tii de actualizar e a ar de inter vale: prima corespunde modificarii p ozi¸tiei F ir stP os[x], iar a doua modific˘ ar ii
p ozi¸tiei LastP os[x].
Prima actualizar e se va face cu noua pondere a nodului x, iar a doua cu noua pondere cu semn schimbat. Vect or ii W eight ¸si SP pot fi modifica¸ti ın tim p constant , ınsa act ualizar ea arborelui de inter vale va avea com plexitat ea tim p O(log(n)). Deci com plexitatea tim p pentru actualizar ea ponderii unui nod va fi O(log(n)). ˆ
ˆ
˘
Problema minimului/ maximului pe un arbore static
5.3
Problemele ce solicit˘ a aflarea valorii maxime sau minime pe un lan¸t din arbore se
r ezolva f oar te asemanator , a¸sa ca vom studia ın continuar e doar problema minimului. Vom r eaminti problema: avand dat un lan¸t elementar din ar b or e ˘
˘
ˆ
L = (x0 , x1 , . . . xn ), unde x0 = u, xn = v ¸si xi = x j ,
∀i
=j
ne inter eseaz˘ a M inV alue(u, v) = mink ∈{0,1,... n} {W eig ht[xi ]}.
a noduri. Ca ¸si la metodele Notam cu w cel mai apropiat str amo¸s comun al celor dou˘ pr ezentat e mai sus, vom ˆım par ¸ti lan¸tul (u, v) ˆın dou˘ a: (u, w ) a lan¸turi de lungime mai mic˘ s¸i (w, v). Vom calcula minimul pe aceste doua lan¸turi, le vom compara, valoarea cautata fiind minimul dintr e ele. Va tr e bui deci sa gasim o metoda de a afla minimul pe un lan¸t (x, y), unde x este str amo¸s al lui y. Pentru a rezolva aceast a pr oblema vom r e¸tine doua ˘
˘
˘
˘
˘
˘
˘
˘
matrici C[ ][ ] ¸si D[ ][ ] de dimensiune n × log(n) pentru care avem: C [i][ j ] = cel de-al 2 j -lea str ˘ amo¸s al nodului i
D [i][ j ] = minimul pe lan¸tul (i, k), unde k este cel de-al 2 j -lea str amo¸s al lui i ˘
a ˆın aceast˘ a lucr ar e ˆın capitolul Metoda de constr uc¸tie a acest or matrici a mai f ost f olosit˘ 4 ¸si are la baz˘ a tehnica programarii dinamice. O descriere a constr uc¸tiei matricii C se ase¸ste la pagina 28. Vom descrie ˆın continuar e cum putem calcula matricea D : g˘ - Pentru un lan¸t de dimensiune 2 (formate din nodul cur ent i ¸si primul sau str amo¸s)
putem afla minimul comparand ponderea nodului cu cea a tatalui ¸si ini¸tializand D[i][0] cu minimul dintr e aceste valor i.
Capitolul 5. Aplica¸tii ale ale problemei LC A
58
- Presupunand cunoscut e valorile pentru lan¸turi de dimensiune 2 j + 1, putem afla minimul pe un lan¸t de dimensiune 2 j +1 + 1 ˆım par ¸tind lan¸tul ˆın alte dou˘ a lan¸tur i j de dimensiune 2 + 1 pentru care cunoa¸stem deja minimele. Avˆ and dat lan¸tul (i, p) (p fiind cel de-al 2 j +1 -lea str amo¸s al lui i) ˆıl vom ˆım p˘ ar ¸ti ˆın lan¸tur ile (i, k) ¸si (k, p), j unde k este cel de-al 2 -lea str ˘ amo¸s al lui i. ˆ In consecin¸ta, p va fi cel de-al 2 j -lea str amo¸s al lui k. Vom compara minimele pe lan¸tur ile (i, k) ¸ si (k, p) ¸si vom ini¸tializa D[i][ j + 1] cu minimul dintr e ele. O b¸tinem pentru matricile C ¸si D ur m˘ at oar ele formule de r ecur en¸ta: P ar ent[i], C [i][ j ] =
C [C [i][ j − 1]][ j − 1],
dac˘ a j = 0 dac˘ a j ≥ 1 ¸si exist˘ amo¸s al lui i a cel de-al 2 j -lea str ˘
min{W eight[i], W eig ht[P ar ent[i]]},
D [i][ j ] =
min{D [i][ j − 1], D[C [i][ j − 1]][ j − 1]},
dac˘ a j = 0 dac˘ a j ≥ 1 ¸si exist˘ amo¸s al lui i a cel de-al 2 j -lea str ˘
De exemplu, pe arborele pr ezentat ˆın figur ˘ a de mai jos, pentru a calcula minimul pe
lan¸tul (3,18) (de dimensiune 5 = 22 + 1) ıl vom rupe ın lan¸tur ile (3,10) ¸si (10,18) (ambele ˆ
ˆ
de dimensiune 3 = 21 + 1). Minimele pe aceste lan¸turi sunt 4, r es p ectiv 1, deci minimul ar ui nod este mar cat ˘ pe lan¸tul (3,18) va fi 1. Ponderea fiec˘ a ˆın figur ˘ a ˆın dreapta no dului.
Figura 5.4: MinValue(3,18) = 1
Constr uc¸tia matricii D va avea com plexitat ea tim p O(nlog(n)) pentru c˘ a fiecare element al sau poate fi ini¸tializat ˆın tim p const ant: pentru j = 0 este necesar ˘ a o sim pl˘ a com par a¸tie ˆıntr e dou˘ a valori, iar celelalte elemente se pot ob¸tine ˆın tim p constant utilizand valorile calculate anter ior .
Pr ezentam mai jos tr ans pusele matricilor C ¸si D asociate arborelui din figura 5.4. O bservam ca nu toate elementele matricilor vor fi ini¸tializate, ci doar p ozi¸tiile (i, j) astf el ˘
Capitolul 5. Aplica¸tii ale ale problemei LC A
59
amo¸s. Pozi¸tiile neini¸tializate vor fi mar cat e ıncat pentru nodul i exist˘ a cel de-al 2 j -lea str ˘
ˆ
mai jos cu valoarea −1. Matricea C : j/i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
-1
1
1
2
2
3
3
4
6
6
7
7
7
10
11
11
13
14
2
-1
-1
-1
1
1
1
1
2
3
3
3
3
3
6
7
7
7
10
3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
1
1
1
1
3
Matricea D : j/i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
-1
5
5
4
3
4
3
4
1
4
3
2
3
5
4
4
3
1
2
-1
-1
-1
4
3
4
3
4
1
4
3
2
3
4
3
3
3
1
3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
4
3
3
3
1
Pentru a afla minimul pe un lan¸t (x, y) de lungime oarecare l, x str amo¸s al lui y, vom ım par ¸ti lan¸tul ın doua lan¸turi de lungime 2 j + 1, unde j = log2 (l − 1). Pentru aceste
ˆ
ˆ
˘
lan¸turi cunoa¸stem minimele, fiind stocat e ın matricea D, le vom compara, iar valoar ea cautat a va fi minimul dintr e ele. Vom proceda astf el: ˆ
˘
am - Aflam minimul pe lan¸tul (k, y), unde k este cel de-al 2 j -lea st r amo¸s al lui y. Not˘ aceast˘ a valoare cu min (k,y) = D [i][ j ]. - Aflam minimul pe lan¸tul (x, p), unde p este aflat pe lan¸tul (x, y) ¸si cel de-al 2 j -lea str amo¸s al sau este x. Putem spune c˘ a este al (l − 2 j − 1)-lea str amo¸s al lui y. Am pr ezentat ˆın sec¸tiunea 3.3.1 (pagina 29) o metod˘ a de calcul pentru cel de-al z -lea str amo¸s al unui nod din arbore folosind matricea C, pentru orice nod astf el ˆıncat acest str amo¸s s˘ a existe. Avˆ and calculat acest nod, minimul pe lan¸tul (x, p) va fi min (x,p) = D [ p][ j ]. - Vom compara min (k,y) cu min(x,p) . Valoarea cautat˘ a este minimul dintr e acestea. Avand precalculat un vector Log ˆın care pe p ozi¸tia i r e¸tinem log2 (i), putem calcula
amo¸s al lui y, ˆın tim p constant. Acest vector se ponderea minim˘ a pe un lan¸t (x, y), x str ˘ poate constr ui ˆın com plexitatea tim p O(n) ¸si a f ost f olosit ¸si ˆın alte sec¸tiuni ale lucr ˘ ar ii. Modul de constr uc¸tie se poate gasi ˆın sec¸tiunea 2.5, la pagina 11. Vom reveni acum la calculul valorii minime pe un lan¸t elementar oarecare (u, v). ˆIn etapa de preprocesare a arborelui vom avea mai mul¸ti pa¸si: - Vom preprocesa arborele astf el ˆıncˆ at s˘ as punde ˆın tim p constant la un quer y a putem r ˘ LC A(u, v). Pentru acest pas vom avea com plexitat ea tim p O(n) - Vom calcula vect or ul Log ˆın tim p liniar - Calculam matricile C ¸si D.
Pentru constr uc¸tia acestor a vom avea com plexitat ea
tim p O(nlog(n)) Com plexitat ea total˘ a a preprocesarii va fi, a¸sadar, O(nlog(n)).
Capitolul 5. Aplica¸tii ale ale problemei LC A
60
Pentru a raspunde la un query M inV alue(u, v) vom proceda astf el: - Calculam w = LC A(u, v). Acest nod poate fi calculat ˆın tim p const ant. - Nodul w este str amo¸s atˆat pentru u, cat ¸si pentru v, deci putem aplica metoda
descr is˘ a mai sus pentru a calcula valorile minime pe lan¸tur ile (u, w) ¸si (w, v). Aceste valori pot fi de asemenea aflate ˆın tim p const ant . - Valoarea minim˘ a pe lan¸tul (u, v) este M inV alue(u, v) = min{M inV alue(u, w), M inV alue(w, v )} Observam c˘ a putem raspunde la un query M inV alue(u, v) ˆın tim p constant.
5.4
Problema minimului pe un arbore dina mic
Spre deosebire de problema minimului pe un arbore static ˆın care se poate execut a un singur tip de oper a¸tie (inter ogar ea minimului pe un lan¸t), ˆın aceast˘ a pr oblem˘ a va mai ˆ aparea un tip de oper a¸tie: modificarea ponderii unui nod. Incer cand s˘ a adaptam meto da pr ezentat ˘ a mai sus pentru un arbore static, vom ob¸tine com plexitatea tim p O(n) pentr u actualizar ea ponderii unui nod. Atunci cˆ and se modific˘ a ponderea unui nod x vor tr e bui actualiza¸ti vect or ul W eight ¸si matricea D. Vector ul W eight poate fi modificat ˆın tim p constant , ˆıns˘ a actualizar ea matricii D este mai costisitoar e. Vor tr e bui actualizate toate p ozi¸tiile care corespund unor lan¸turi ce con¸tin nodul a carui pondere se modifica. Vom calcula numarul acestor a ˆın cel mai defavorabil caz: presupunem dat un arbore liniar cu n = 2 j + 1 noduri ¸si modificam exact nodul ”din mijloc”, adic˘ a al 2 j −1 + 1 nod. ˆIn acest caz vom avea 2 lan¸turi de lungime 2 care se vor modifica, 3 lan¸turi de lungime 3, . . . 2 j −1 + 1 lan¸turi de lungime 2 j −1 + 1 ¸si un lan¸t de lungime 2 j + 1 (acesta con¸tine tot arborele de f apt). Avem: Numarul de lan¸turi = 1 + 3 + 5 + 9 + . . . + 2 j −1 + 1
= 1 + 2 + 4 + 8 + . . . 2 j −1 + j = 2 j
−
1 + j = n − 2 +j
am O(n) lan¸turi, deci vom avea comObservam c˘ a ˆın acest caz va tr e bui s˘ a modific˘ plexitat ea tim p O(n) pentru actualizar e ˆın acest caz. Vom pr ezent a ˆın continuar e dou˘ a solu¸tii pentru problema minimului pe un arbore dinamic ce utilizeaz˘ a descompunerea ˆın lan¸turi a arborelui ¸si arbori de inter vale ca algor itmi s¸i structuri de date auxiliare. Cele doua solu¸tii dif er a doar prin modul de descompunere al arborelui, acest a deter minand com plexitatea tim p necesar a pentru a r as punde la un quer y ce solicit a minimul pe un lan¸t al arborelui. Pentru prima solu¸tie vom avea com plexitatea √ tim p O( n · log(n)), iar pentru a doua vom ob¸tine O(log2 (n)). Actualizar ea se p oate realiza ın O(log(n)) pentru ambele solu¸tii. ˘
˘
˘
˘
ˆ
˘
Capitolul 5. Aplica¸tii ale ale problemei LC A
5.4.1
61
Solu¸ and descompunerea dup ˘ a cel mai lung lan¸t tie utilizˆ
Aceast˘ a meto d˘ a va folosi tehnica utilizat ˘ a pan˘ a acum de a rupe lan¸tul (u, v) pe care
se cere minimul ˆın alte dou˘ a lan¸tur i: (u, w) ¸si (w, u), unde w = LC A(u, v). Vom calcula minimele pe aceste lan¸turi, le vom compara, iar valoarea c˘ autat˘ a va fi minimul dintr e acestea. Ne vom ocupa ˆın cont inuar e de calculul minimului pe un lan¸t (x, y) unde x este str amo¸s al lui y.
Vom descompune arborele ˆın mai multe lan¸turi dis juncte. Alegem cel mai lung lan¸t
am din arbore. Odat din arbore ce are ca extr emit ¸ti r a si un nod f r unz˘ a ¸si ˆıl elimin˘ ˘dacin a ¸ cu eliminarea nodurilor de pe lan¸t, vom elimina s¸i muchiile cor es punzatoar e lor. Dupa ˘ aceast˘ a eliminare vor ramane, evident, mai multe com p onente conexe T1 , T2 , . . ., fiecar e fiind un arbore. Vom aplica recursiv acest procedeu arborilor T1 , T2 , . . .. Ne vom opr i atunci cand fiecare nod din arbore este inclus ˆıntr -un lan¸t. Aceast˘ a tehnic˘ a se nume¸ste ˆ descompunere dup˘ a cel mai lung lan¸t (eng. longest path decom position). In continuar e, pentru sim plitat e, o vom numi descompunere long est.
Figura 5.5: Descompunere longest
Vom explica acest tip de descompunere pentru arborele din figura de mai sus.
O b-
servam c˘ acin˘ a cel mai lung lan¸t dintr e r ad˘ a ¸si o f r unz˘ a este lan¸tul (1,18) de lungime 6, nodul 18 fiind aflat pe cel mai de jos nivel al arborelui. Eliminˆ and acest lan¸t vor r amane 3 com p onente conexe: subarborii ce au ca r ˘ adacini nodurile 2 (T1 ), 9 (T2 ) ¸si 7 (T3 ). - Pentru arborele T1 cel mai lung lan¸t r ad˘ acina-f r unz˘ a este (2,8). Vom elimina acest
lan¸t ¸si va ramane o singur a com p onenta conexa: arborele format din nodul 5. Acest nod va forma un nou lan¸t al descom puner ii. ˘
˘
˘
- Arborele T2 are un singur nod, nodul 9. Vom forma un nou lan¸t ce va con¸tine un singur nod.
am acest lan¸t ¸si - ˆIn arborele T3 cel mai lung lan¸t r ˘ adacina-f r unz˘ a este (7,15). Elimin˘
Capitolul 5. Aplica¸tii ale ale problemei LC A
62
ob¸tinem 3 com p onente conexe: arborele format din nodul 16, arborele format din
ar uia cor es punzˆ nodul 12 ¸si cel format din nodurile 13, 17, fiec˘ andu-i cate un lan¸t ˆın descompunerea longest. Remarcam c˘ a fiecare lan¸t are ca extr emit˘ a¸ti un nod inter n ¸si o frunza, cu exce p¸tia celor de dimensiune 1 formate dintr -o singur ˘ a f r unz˘ a. De asemenea, mai observam ca ˘ exist˘ a muchii care nu fac parte din niciun lan¸t al descompunerii (colorate mai sus cu gr i). Acest lucru se dat or eaz˘ a f aptului c˘ a descompunerea se face dup˘ a noduri ¸si nu dup˘ a muchii.
ar and atunci cand Aceste muchii sunt exact muchiile care fac leg˘ at ur a ˆıntr e lan¸turi, ele dis p˘ este eliminat un lan¸t. √
Lema 5.2. Pe un lan¸t de la r ad acina la o f run z a avem noduri ce pot face parte din O( n) ˘ ˘
˘
˘
l an ¸t ur i ale d escom puner ii.
Demon str a¸tie: Cazul cel mai defavorabil este cand descompunem arborele ın lan¸turi de ˆ
lungimi k, k − 1, k − 2, . . . 1. Avem n = 1+2+... +k =
√− (k −1) · n) = ⇒ k est e de ordinul O ( k
2 ˆ
In acest caz, putem gasi un lan¸t care s˘ a con¸tin˘ a noduri din toate cele k lan¸turi ale descompunerii. Un exemplu este pr ezentat mai jos. Lan¸tur ile (1,26) ¸si (1,27) con¸tin no dur i din fiecare lan¸t al descom puner ii.
Figura 5.6: Cel mai defavorabil caz pentru descompunerea longest
Vom continua cu descrierea solu¸tiei problemei aflarii minimului pe un lan¸t (x, y), x str amo¸s al lui y, folosind descompunerea longest. Vom stoca lan¸tur ile descompunerii ¸si le
vom preprocesa ast f el ˆıncat s˘ a putem ob¸tine minimul pentru orice inter val de pe aceste
lan¸turi. O solu¸tie ar fi sa constr uim cate un arbore de inter vale pentru fiecare lan¸t din decompunere ın care sa r e¸tinem minimele pe inter vale. Vom putea astf el atat sa ob¸tinem minime pe anumite inter vale de pe lan¸tur ile descompunerii, cat ¸si sa mo dificam p onder i pentru nodurile lan¸tur ilor ın com plexitat ea tim p O(log(n)). Pentru a ob¸tine minimul pe ˘
ˆ
ˆ
˘
˘
˘
˘
ˆ
lan¸tul (x, y) avem doua cazur i: ˘
- Lan¸tul (x, y) este inclus com plet sau coincide cu un lan¸t al descompunerii longest (pe care ˆıl notam cu (p, q)). Vom presupune c˘ a x este al i-lea nod de pe lan¸tul (p, q),
Capitolul 5. Aplica¸tii ale ale problemei LC A
63
iar y este al j -lea nod. ˆ and un In acest caz putem afla minimul pe lan¸tul (x, y) ef ectuˆ query pe arborele de inter vale asociat lan¸tului (p, q) ce solicit˘ a minimul pe inter valul
(i, j ). - Lan¸tul (x, y) con¸tine noduri aflate pe mai multe lan¸turi ale descompunerii. ˆIl vom ım par ¸ti ˆın mai multe lan¸turi de lungimi mai mici, dis juncte, fiecare din acestea
ˆ
apar¸tinand unei singur lan¸t din descompunerea longest. Vom afla minimele pe aceste lan¸turi procedand ca la punctul anter ior , valoarea cautat a fiind minimul dintr e ele. ˘
˘
Spre exemplu, pentru a ob¸tine minimul pe lan¸tul (1,14) al arborelui pr ezentat ˆın figur a 5.5 vom inter oga arborele de inter vale asociat celui mai lung lan¸t al descompunerii longest solicit and minimul pe inter valul [1, 5]. Aflarea minimului pe lan¸tul (1,16) este pu¸tin mai costisitoar e. Vom ˆım par ¸ti lan¸tul ˆın alte 3 lan¸tur i: (1,3), (7,11) ¸si (16). Vom afla minimul inter ogˆ and arborii de inter vale asocia¸ti lan¸tur ilor descompunerii care includ cele 3 lan¸tur i
¸si vom returna valoarea minima dintr e acestea. ˘
Pentru im plementar ea metodei pr ezentate mai sus, va tr e bui sa pastr am ın memor ie mai multe inf orma¸tii r ef er itoar e la lan¸tur ile descompunerii: un vector ın care past r am nodurile din lan¸t, un vect or ın care stocam arborele de inter vale asociat lan¸tului ¸si lungimea lan¸tului. Pentru a putea ım par ¸ti lan¸tul (x, y) pe care ni se cere minimul ın mai multe lan¸turi incluse ın lan¸turi ale descompunerii longest vom pastra pentru fiecare lan¸t un nod tata. Acest nod este tatal nodului aflat pe cel mai mic nivel din lan¸t. Pentru a r ealiza ım par ¸tir ea, vom ”urca” de la nodul y spre nodul x prin acesti ta¸ti ai lan¸tur ilor , tr ecand la fiecare pas pr intr -un lan¸t din descompunere. O bser vam ca vect or ii care stocheaza nodur ile lan¸tur ilor au lungimi variabile, dar suma acest or lungimi este n pentru ca fiecare nod va aparea ıntr -un singur lan¸t. Vom pastra inf orma¸tiile descrise mai sus astf el: ˘
ˆ
ˆ
˘
ˆ
ˆ
˘
ˆ
ˆ
ˆ
˘
˘
˘
ˆ
- P ath[i].Ar r a y[ ] va fi vect or ul ˆın care pe p ozi¸tia j vom r e¸tine al j -lea nod din
lan¸tul i al descompunerii longest. Este f oar te important ca aceste noduri sa apar a ın vector ordonate cr escat or dup a adancime. Vom r e¸tine lungimea lan¸tului i ın P ath[i].Length. ˘
ˆ
˘
ˆ
˘
ˆ
- P ath[i].T r ee[ ] va fi vector ul ˆın care vom stoca arborele de inter vale asociat lan¸tului i din descompunere. Acest vect or va ocupa O(k) memorie, unde k este lungimea lan¸tului pentru care se constr uie¸ste arborele. Deci ˆınsumand lungimile acestor vec-
tor i, vom ob¸tine un numar de ordinul O(n). ˘
- P ath[i].P arent va fi variabila care va r e¸tine par intele lan¸tului i din descom puner e. Vom mai r e¸tine ˆın memorie doi vector i de dimensiune n: W hatP ath[ ] ˆın care p e
p ozi¸tia i vom r e¸tine lan¸tul caruia apar¸tine nodul i ¸si W hatP os[ ] ˆın care elementul i va pastra pozi¸tia pe care apare nodul i ˆın lan¸tul din care face parte. Vector ul W hatP os va fi util la inter ogar ea arborilor de inter vale asocia¸ti lan¸tur ilor descom puner ii.
Pr ezentam mai jos un tabel cu inf orma¸tii despre lan¸tur ile descompunerii longest a arborelui din figura 5.5.
Capitolul 5. Aplica¸tii ale ale problemei LC A
64
i
P ath[i].P ar ent
P ath[i].Length
P ath[i].Ar r a y[ ]
1
-1
6
1 3 6 10 14 18
2
6
1
9
3
3
3
7 11 15
4
11
1
16
5
7
1
12
6
7
2
13 17
7
1
3
248
8
2
1
5
Avand defini¸ti ace¸sti vector i, putem descrie modul de im plement ar e al descom puner ii longest .
Pe masur a ce descompunem arborele ın lan¸turi, vor fi ini¸tializa¸ti ¸si vector ii men¸tiona¸ti mai sus. Descompunerea se va face ın doua etape. In prima et apa vom deter mina pentru fiecare nod al arborelui fiul care face parte din cel mai lung lan¸t de la ˘
ˆ
ˆ
ˆ
˘
ˆ
˘
r es pectivul nod pana la un nod f r unza. In a doua etapa, utilizand inf orma¸tiile din pr ima etapa, vom putea constr ui decompunerea ¸si vector ii men¸tiona¸ti mai sus. ˘
˘
ˆ
˘
ˆ
Descrierea primei etap e: In aceasta etapa vom folosi ınca un vector Son[ ] de dimensiune n, ın care pe p ozi¸tia i vom pastra fiul nodului i care apar¸tine celui mai lung lan¸t de la nodul i pana la un nod frunza. Acest nod va fi succesorul nodului i ın lan¸tul descompunerii longest din care vor face parte. Putem constr ui vector ul Son folosind o parcurgere ın adancime. Vom folosi o f unc¸tie r ecur siva ce are ca par ametr u nodul cur ent s¸i r etur neaza lungimea celui mai lung lan¸t de la el pana la o frunza. Observam ca p entru un nod f ru nza nu va exista fiul cautat ¸si vom ini¸tializa elementul cor es punzator din ˘
˘
ˆ
˘
ˆ
˘
ˆ
ˆ
˘
˘
ˆ
˘
˘
˘
vect or ul Son cu −1. Pentru un nod inter n, vom calcula ˆıntˆ ai lungimile lan¸tur ilor de la
fiii sai pan˘ a la o f ru nz˘ a ¸si apoi vom compara aceste valori, alegˆ and ca succesor ˆın lan¸tul din descompunerea longest pe cel care apar¸tine celui mai lung drum pan˘ a la o f r unz˘ a. De exemplu pentru nodul 1 din arborele pr ezentat ˆın figura 5.5 avem doi fii: nodurile 2 ¸si 3. Cel mai lung lan¸t pan˘ a la o f r unz˘ a din care face parte nodul 2 este (2,8) ¸si are lungimea 3. Nodul 3 face parte din lan¸tul (3,18) ce are lungimea 5, deci vom alege ca succesor al lui 1 ˆın lan¸tul din descompunerea longest nodul 3. ˆ
Descrierea etap ei a d ou a: In aceasta etapa vom constr ui lan¸tur ile din descom punerea longest ¸si vom ini¸tializa toate datele suplimentar e asociate lor. Constr uc¸tia se va realiza utilizand tot o parcurgere ın adancime a arborelui. Pentru fiecare nod x din ar b or e vom ef ectua mai multe oper a¸tii: ˆ
˘
˘
ˆ
- Vom adauga nodul x lan¸tului cur ent din descompunere ¸si vom ini¸tializa vect or ii W hatP ath ¸si W hatP os pentru acest nod - Vom parcurge Son[x], adaugˆ andu-l lan¸tului cur ent - Parcurgem apoi to¸ti ceilal¸ti fii ai nodului x. Pentru fiecare din ace¸stia vom crea un nou lan¸t ¸si vom ini¸tializa tat˘ al acest uia cu nodul x
Capitolul 5. Aplica¸tii ale ale problemei LC A
65
Algor itmul 5.3: Func¸tia pentru prima etapa a descompunerii: constr uc¸tia vector ului S on. ˘
FindSon(Son, nod) b egi n LongestPathSon = −1; MaxLengthPath = 0; foreach son k of nod do Aux = FindSon(Son, k ); if M axLengthP ath < Aux th en LongestPathSon = k; MaxLengthPath = Aux;
Son[nod] = LongestPathSon; return M axLengthP ath + 1;
Pr ezentam mai jos f unc¸tia r ecur siva ce r ealizeaza descompunerea longest. Func¸tia f olose¸ste variabila globala P aths care memor eaza numar ul de lan¸turi create pana la un moment dat al parcurgerii. Inainte de apelarea f unc¸tiei va tr e bui sa cr eam un lan¸t al car ui tat˘a sa ıl ini¸tializam cu −1 (acesta va corespunde r adacinii ¸si nu va avea un nod tata). b or elui. Apelam apoi f unc¸tia avand ca par ametr u r adacina ar ˘
˘
˘
˘
ˆ
ˆ
˘
˘ ˆ
˘
˘
˘
˘
˘
˘
˘
Algor itmul 5.4: Func¸tia pentru a doua etapa a descompunerii: lan¸tur ilor
constr uc¸tia
˘
Longe stPat hDecom p osition(Son, nod) b egi n Pat h[Pat hs].Length = Path[Paths].Length+1; Pat h[Pat hs].Arr ay[Path[Paths].Length] = nod; WhatPath[nod] = Paths; WhatPos[nod] = Path[Paths].Length;
// dac
nodul nu este frunza, parcurgem Son[nod]
if Son[nod] = −1 then LongestPat hDecomposition(Son, Son[nod])
// parcurgem ceilal¸i fii ai nodului foreach son k of nod do if k = Son[nod] then Paths = Pat hs+1; Path[Paths].Par ent = nod; LongestPathDecomposit ion(Son, k );
Observam c˘ a pentru ambele etape avem com plexitatea tim p O(n).
Fiecare etap˘ a const˘ a de f apt ˆıntr -o parcurgere a arborelui, de-a lungul ei actualizandu-se date auxiliar e
r ef er itoar e la lan¸tur ile descompunerii longest. Avand deter minat e lan¸tur ile ce descompun arborele, vom constr ui cate un arbore de inter vale pentru fiecare lan¸t. Am pr ezentat ın sec¸tiunea 2.7 (pagina 14) o metoda de constr uc¸tie a arborilor de inter vale ın com plexitat ea tim p O(k), unde k este lungimea vecˆ
ˆ
ˆ
˘
Capitolul 5. Aplica¸tii ale ale problemei LC A
66
tor ului pentru care dorim sa constr uim arborele. Pentru constr uc¸tia arborilor de inter vale asocia¸ti lan¸tur ilor din descompunerea longest vom avea com plexitatea t otala O(n) p entr u ca ınsumand lungimile lan¸ tur ilor vom ob¸tine valoarea n. ˘
˘
˘ ˆ
Ne vom ocupa acum de aflarea minimului pe un lan¸t (x, y), x str amo¸s al lui y. Metoda de aflarea a acestei valori a f ost descr is˘ a anter ior pe scur t. Vom relua aceast˘ a metod˘ a
pr ezentand-o ˆın detaliu. Se r emar c˘ a dou˘ a cazur i: - Nodurile x ¸si y fac parte din acela¸si lan¸t al descompunerii longest. ˆIn acest caz, minimul poate fi aflat int er ogˆ and arborele de inter vale asociat lan¸tului din descom punere din care fac parte nodurile. Inter valul pe care se va solicit a minimul va fi [W hatP os[x], W hatP os[y]]. - Nodurile x ¸si y nu apar¸tin aceluia¸si lan¸t al descompunerii longest . Vom ”r up e”
lan¸tul (x, y) ın lan¸turi de lungimi mai mici, dis juncte, fiecare din acestea fiind inclus com plet ıntr -un lan¸t al descompunerii longest. Pe aceste lan¸turi putem afla minimele aplicand metoda descr isa la punct ul pr ecedent . Vom nota lan¸tur ile ın care se descom pune (x, y) cu L1 , L2 , . . . Lk . Vom ef ectua k pa¸si, la pasul i deter minand minimul pe lan¸tul Lk +1−i . Pentru a tr ece dintr -un lan¸t al decompunerii la ur mat or ul vom folosi variabilele P ath[i].P arent. La primul pas vom calcula minimul pe inter valul [1, W hatP os[y]] din lan¸tul Lk . La pa¸sii 2, 3, . . . , k − 1 vom calcula minimul pe inter valul [1, W hatP os[z]] din lan¸tul Lk +1−i , unde z este tat al lan¸tului anter ior , adica Lk +2−i . La pasul k vom calcula minimul pe inter valul [W hatP os[x], W hatP os[z]] al lant¸ului L1 , unde z este tatal lan¸tului L2 . Ne vom opri atunci cand nodul x ¸si par intele lan¸tului exploatat anter ior fac parte din acela¸si lan¸t al descom puner ii. ˆ
ˆ
˘
ˆ
ˆ
˘
˘
˘
La fiecare pas vom compara minimul ob¸tinut pe lan¸tul cur ent cu valoarea minim˘ a ob¸tinut˘ a pan˘ a la acest pas ¸si vom r e¸tine minimul dintr e ele. Astf el c˘ a dup˘ a ef ectuar ea celor k pa¸si vom avea calculat ˘ a valoarea minim˘ a pe lan¸tul (x, y ). √
Com plexitat ea tim p a unui astf el de query este O( n · log(n)), p entru c˘ a pe un lan¸t √ (x, y), x str amo¸s al lui y, putem avea noduri din O( n) lan¸tur ile ale descompunerii ¸si pentru fiecare din aceste lan¸turi vom avea cate un query pe arborele de inter vale asociat . Query-ul pe arborele de inter vale va avea com plexitatea O(log(n)), deci com plexitatea √
totala va fi O( n · log(n)). ˘
Pr ezentam ın continuar e f unc¸tia care pr ime¸ste ca par ametr ii nodurile x ¸si y, x str amo¸s al lui y ¸si r et ur neaza minimul pe lan¸tul (x, y). Est e f olosita f unc¸tia QuerySegmentT r ee cu par ametr ii P [ ], i, j care r etur neaza minimul dintr e valorile cuprinse ın inter valul [i, j ] din vector ul P [ ] utilizand un arbore de inter vale. O descriere mai detaliat a poate fi gasita ın capitolul 2 ( pagina14). ˆ
˘
˘
˘
ˆ
˘
ˆ
˘
˘
Capitolul 5. Aplica¸tii ale ale problemei LC A
67
b or elui Algor itmul 5.5: Func¸tia Query pr ime¸ste ca par ametr ii doua noduri ale ar ¸si r etur neaza valoarea minima pentru lan¸tul format de cele doua noduri date ca par ametr u ˘
˘
˘
˘
Quer y(Weight, x, y) b egi n Minim = Weight[x]; Aux = 0; // variabila Aux devine 1 dup
ce am calculat minimul pentru toate
// lan¸urile din descompunerea lui (x, y) while Aux = 1 do if W hat P ath[x] = W hat P ath[y ] then Minim = min(Minim, Quer ySegment Tr ee(Path[WhatPat h[x]], What Pos[x], WhatPos[y])); Aux = 1; else Minim = min(Minim, Quer ySegment Tr ee(Path[WhatPat h[y]], 1, What Pos[y ])); y = Path[WhatPath[y]].Par ent; return Minim ;
am Actualizar ea ponderii unui nod din arbore este mult mai sim pl˘ a. Va tr e bui sa ˘ afl˘
lan¸tul din care face parte nodul ¸si sa actualizam arborele de inter vale asociat. Vom f olosi f unc¸tia U pdateSeg mentT ree(P [ ], i, j) care, utilizand un arbore de inter vale pentru vector ul P [ ], va mo difica elementul i, noua sa valoare fiind j . O descriere pentru aceasta f unc¸tie se poate gasi ın sec¸tiunea 2.7 (la pagina 14). Pr esupun and ca se modifica p onder ea nodului z ¸si noua valoarea este j, atunci actualizar ea va consta ıntr -un apel al f unc¸tiei U pdateSegmentT ree cu par ametr ii W hatP ath[z ], W hatP os[z] ¸si j . ˘
˘
ˆ
ˆ
˘
˘
ˆ
Revenim la problema aflarii valorii minime pe un lan¸t elementar oarecare (u, v) dintr -
un arbore dinamic. Vom relua mai jos pa¸sii din etapele de preprocesare, raspuns la un query ¸si actualizar e a ponderii unui nod din arbore ¸si vom calcula com plexitatea tim p
pentru fiecare. - ˆIn etapa de preprocesare vom preprocesa arborele astf el ˆıncat s˘ a putem r as pund e la query-uri LC A ˆın tim p constant . Pentru acest pas vom avea com plexitatea tim p
O(n). Apoi vom ef ectua descompunerea longest ¸si vom constr ui cate un arbore de inter vale pentru fiecare lan¸t din descompunere. S ¸ i acest pas se poate ef ectua ın tim p liniar, deci com plexitatea tim p a pr e pr ocesar ii va fi O(n). ˆ
˘
- Pentru a raspunde la un query de ti pul M inim(u, v) va tr e bui mai ˆıntˆ ai s˘ a de-
ter minam nodul w = LC A(u, v) ¸si apoi sa aflam minimele pe lan¸tur ile (u, w) ¸si (w, v), valoarea cautat a fiind minimul dintr e acestea. Cel mai apropiat str amo¸s comun al nodurilor se poate deter mina ın tim p constant , iar aflarea minimului p e lan¸tur ile (u, w) s¸i (w, v) am explicat mai sus ca se poate realiza ın com plexitatea √ √ tim p O( n · log(n)). A¸sadar, com plexitat ea totala va fi O( n · log(n)). ˘
˘
˘
˘
ˆ
˘
ˆ
˘
- Actualizar ea ponderii unui nod din arbore necesit˘ a atat modificarea vector ului W eig ht
Capitolul 5. Aplica¸tii ale ale problemei LC A
68
(care se poate realiza ˆın tim p const ant), cˆ at ¸si a arborelui de inter vale asociat lan¸tului din descompunerea longest din care face parte nodul (pentru care vom avea com-
plexitat ea tim p O(log(n))). Deci com plexitat ea total˘ a va fi O(log(n)).
5.4.2
b or elui Un alt tip de descompunere a ar
Vom pr ezent a ˆın aceast˘ a sec¸tiune o alt˘ a modalitate de a descompune un arbore ˆın lan¸turi. Utilizand acest tip de descompunere ˆın solu¸tia pr ezentat˘ a mai sus pentru pr oblema minimului pe un lan¸t dintr -un arbore dinamic, am putea ob¸tine o com plexitate tim p mai bun˘ a pentru raspunsul la un query. ˆIntr ucat cele dou˘ a solu¸tii dif er ˘ a doar prin definir ea descompunerii arborelui, ne vom concentr a ˆın continuar e doar pe descrierea acesteia. Aceast˘ a descompunere a f ost intr odus˘ a de Sleator ¸si Tarjan [8] ˆın anul 1982 ¸si denumit˘ a ”heavy path decomposition” (eng.). ˆIn continuar e, pentru sim plitate, o vom numi descompunere heavy. Pentru a descrie aceast˘ a descompunere va tr e bui s˘ a definim dT [v] ce va r e pr ezenta numarul de descenden¸ti ai nodului v din arborele T , inclusiv nodul v. Un descendent al unui nod v este un nod ce are ca str amo¸s nodul v .
Fie e = (v, P ar ent[v]) o muchie din arborele T . O vom etichet a astf el: - dac˘ a 2 · dT [v] > dT [P ar ent[v]], atunci va fi etichetat˘ a ca muchie grea (denumirea ˆın englez˘ a dat˘ a de Sleator ¸si Tarjan este ”heavy ” ¸si de aici vine numele descom puner ii)
- alt f el va fi etichetat˘ a ca muchie u s ¸oar a (eng. light) ˘
Avand astf el etichetat e muchiile, se vor forma ˆın arbore lan¸turi care vor con¸tine doar muchii grele.
Aceste lan¸turi le vom denumi, pornind de la muchiile care le f ormeaza,
lan¸turi grele. Fiecare nod care este incident doar cu muchii u¸soare va forma un lan¸t gr eu de dimensiune 1. Pr ezentam ın figura de mai jos descompunerea heavy a arborelui din figura 5.5. Etichetele din dreapta nodurilor vor indica numarul de descenden¸ti ai nodului. ˆ
Figura 5.7: Descompunere heavy
Capitolul 5. Aplica¸tii ale ale problemei LC A
69
O bser va¸tii: 1. Un nod al arborelui poate fi incident cu cel mult o muchie grea. Presupunand ca ˘ din nod pleac˘ a mai multe muchii grele, ar ˆınsemna c˘ a nodul s˘ a ai b˘ a mai mul¸ti fii cu numarul de descenden¸ti de dou˘ at numarul de descenden¸ti ai a ori mai mare decˆ nodului, ceea ce este absur d. 2. Observam ca, spre deosebire de descompunerea longest , ˆın descompunerea heavy
putem avea noduri inter ne care f ormeaz˘ a lan¸turi de lungime 1.
Acest lucru se
ınt am pl˘ a deoarece un nod poate s˘ a nu ai b˘ a nicio muchie grea incidenta.
ˆ
3. Avand muchia u¸soar ˘ a e = (v, P ar ent[v]), numarul de descenden¸ti ai nodului P ar ent[v]
at numarul de descenden¸ti ai nodului v. Avem: este cel pu¸tin de dou˘ a ori mai mare decˆ dT [P ar ent[v]] dT [v] dT [v] ≤ = =⇒ d T [P ar ent[v]] ≥ 2d T [v] > 2 2 dT [v] =⇒ dT [P ar ent[v]] > 2
Lema 5.3. Fie P un lan¸t din arbore cu o extremitate ˆın r ad acina ¸ ınt r-un nod si ceal al ta f run z a. Acest lan¸t poate con¸tine cel mult ⌊log2 (n)⌋ muchii u s ¸oar e. ˘ ˘
˘
˘ ˆ
˘
Demon str a¸tie: Demonstr a¸tia acestei leme se bazeaza pe obser va¸tia 3 de mai sus. Por nim de la nodul f r unza al lan¸tului ¸si parcurgem lan¸tul ın sus pana la radacina. La fiecare pas ın care urcam la un nod aflat pe un nivel mai mic pr intr -o muchie u¸soara, se va dubla numarul de noduri din subarborele a car ei r adacina este nodul ın care ne aflam (conf orm obser va¸tiei 3). Presupunand ca ur cam doar prin muchii u¸soare, la primul pas avem ın subarbore cel pu¸tin 2 noduri, la pasul 2 vom avea cel pu¸tin 4 noduri, ... la pasul k vom avea cel pu¸tin 2k noduri. S ¸ tim ca arborele are n noduri, deci 2k ≤ n =⇒ k ≤ ⌊log2 (n)⌋. k r e pr ezinta exact numarul de muchii parcurse pana la r adacina, deci pe acest lan¸t vom avea cel mult ⌊log2 (n)⌋ muchii u¸soare. Cazul cand ur cam doar pe muchii u¸soare este cel mai defavorabil, deoarece daca pe lan¸t apare la un moment dat o muchie grea aceasta va mari numarul de noduri din subar b or e. ˘
˘
ˆ
˘
ˆ
˘
˘
˘
˘
ˆ
˘
ˆ
˘
˘
˘
˘
˘
˘
l an ¸t ur i. O bser va¸tia 5.2. Muchiile u s ¸oar e din arbore sunt cele care fac l e g at ur il e ınt re ˘
ˆ
Avand cel mult [log2 (n)] muchii u s ¸oar e pe un lan¸t de la r ad acina la un nod f run z a ın seamna ˆ
˘ ˘
˘
˘ ˆ
˘
ca nodurile de pe acest lan¸t vor face parte din cel mult [log2 (n)] l an ¸t ur i ale d escom puner ii. ˘
Vom explica, utilizand acesta obser va¸tie, de ce folosind descompunerea heavy p entr u rezolvarea problemei minimului pe un lan¸t dint r -un arbore dinamic vom ob¸tine o com plex-
itate tim p mai buna pentru rezolvarea unui query decat utilizand descompunerea longest. Pentru rezolvarea unui query, ım par ¸team lan¸tul (u, v) pentru care se dorea aflarea minimului ponderilor nodurilor sale ın doua lan¸tur i: (u, w) ¸si (w, v), unde w = LC A(u, v ). Apoi, fiecare din aceste lan¸turi era ım par ¸tit ın mai multe lan¸turi dis junct e, de lungimi mai mici, incluse com plet ın lan¸turi ale descompunerii ¸si se putea afla minimul pentru ele ın com plexitat ea tim p O(log(n)) u tilizand arbori de inter vale. Folosind descom puner ea longest , am aratat ca lan¸tur ile (u, w) ¸si (w, v) ın cel mai defavorabil caz ar fi putut fi √ √ ım par ¸tite ın O( n) lan¸turi dis juncte, ob¸tinand o com plexitat e tim p O( n · log(n)) p entr u rezolvarea unui query. Utilizand descompunerea heavy, ın cel mai defavorabil caz lan¸tur ile ˘
ˆ
ˆ
ˆ
˘
ˆ
˘
ˆ
ˆ
ˆ
˘
ˆ
ˆ
ˆ
ˆ
ˆ
Capitolul 5. Aplica¸tii ale ale problemei LC A
70
(u, w) ¸si (w, v) vor fi ˆım par ¸tite ˆın cel mult O(log(n)) lan¸turi dis juncte, ob¸tinˆ and astf el com plexitat ea tim p O(log 2 (n)) pentru a afla raspunsul la un query ce solicit˘ a minimul pentru lan¸tul (u, v ).
Vom descrie ˆın continuar e o modalitat e de im plement ar e a descompunerii heavy ˆın com plexitat ea tim p O(n). Ca ¸si descompunerea longest, descompunerea heavy se va r ealiza
ın dou˘ a etape: ˆın prima etap˘ a vom constr ui vector ul Son[ ] ˆın care pentru fiecare nod i din
ˆ
arbore vom pastra pe p ozi¸tia i succesorul sau (dac˘ a exista) ˆın lan¸tul din descom puner ea heavy din care face parte. ˆIn a doua etap˘ a vom constr ui lan¸tur ile descompunerii heavy. Avand calculat vect or ul Son[ ], pentru a contr ui l an¸tur ile putem aplica metoda f olosit˘ a la descompunerea longest . Ne vom concent r a aten¸tia ˆın continuar e pe constr uc¸tia vect or ului Son[ ].
Pentru a calcula acest vector vom r e¸tine ın memorie un alt vector de dimensiune n, D escendents[ ] ın care pe p ozi¸tia i vom pastra numarul de descenden¸ti ai nodului b or elui. i, inclusiv el. Putem calcula acest vector pr intr -o parcurgere ın adancime a ar Pentru un nod f r unza valoarea cautat a este 1. Pentru un nod inter n vom calcula ıntai numarul de descenden¸ti pentru fiii sai, vom ınsuma aceste valori ¸si vom adauga o unitate pentru ca tr e buie numarat ¸si nodul cur ent. Avand calculat numar ul de descenden¸ti at at pentru nodul cur ent x, cat ¸si pentru to¸ti fiii sai y1 , y2 , . . . , y k , vom compara numarul d e descenden¸ti ai nodului x cu numarul de descenden¸ti ai fiecarui fiu ¸si daca exista j astf el ıncat 2 · D escendents[y j ] > D escendents[x], atunci vom ini¸tializa Son[x] cu y j , altf el vom ini¸tializa Son[x] cu −1. ˆ
ˆ
ˆ
˘
˘
ˆ
˘
ˆ
ˆ
˘
˘
˘
˘
ˆ
Algor itmul 5.6: Constr uc¸tia vector ului Son pentru descompunerea heavy FindSonHeavy(Son, nod) b egi n Descendent s[nod] = 0; foreach k son of nod do Aux = FindSonHeay(Son, nod); Descendents[nod] = Descendent s[nod] + Aux;
Descendent s[nod] = Descendents[nod] + 1; Aux = − 1; foreach k son of nod do if 2 · D escendent s[k ] > D escendents[nod] th en Aux = k ; Son[nod] = Aux;
Com plexitat ea tim p pentru calculul vector ilor Son ¸si Descendents este evident O(n)
pentru ca fiecare nod este parcurs o singur a dat a. Faptul ca pentru fiecare nod par cur gem fiii sai de doua ori, prima dat a pentru a calcula vectr ul Descendents, a doua oar a pentru a ini¸tializa vector ul Son, va mari constant a algor itmului, dar nu va schimba com plexitat ea. Avand calculat vect or ul Son, vom constr ui l an¸tur ile descompunerii heavy aplicand aceea¸si metoda ca ¸si la descompunerea longest . Am explicat anter ior ca ¸si aceasta et apa se r ealizeaza ın tim p liniar, deci com plexitat ea totala pentru realizarea descompunerii heavy ˘
˘
˘
˘
˘
˘
ˆ
˘
˘
˘ ˆ
˘
˘
˘
Capitolul 5. Aplica¸tii ale ale problemei LC A
este O(n).
71
Bi bliogr afie [1] Michael A. Bender, Mar tin Far ach-Colton. The LCA Problem Revisited . Proc. 4th Latin American Symposium on Theor etical Informatics. Lect ur e Notes in Com puter Science, vol. 1776 (2000) [2] Johannes Fischer, Volker Heun. Theoretical and Practical Improvements on the R MQ Problem with Applications to LCA and LCE . Proc. 17th Annual Symposium on Com-
binatorial Pattern Matching. Lectur e Notes in Com puter Science, vol. 4009 (2006) [3] Erik D. Demaine, Gad M. Landau, Oren Weimann. On Cartesian Trees and Ran ge Minimum Queries. Proc. 36th Inter nat ional Colloquium on Automat a, Languages and Programming (ICALP). Lect ur e Notes in Com puter Science, vol. 5555 (2009) [4] Thomas H. Cormen, Charles E. Leiserson, Ronald L. R ivest , Clifford Stein. I nt ro d uction to Algorithms, Second Edition. The MIT Press (2001) [5] Baruch Schieber, Uzi Vishkin. On Finding Lowest Common Ancestors: S im pl i ficat ion and Parallelization. SIAM Journal on Com puting, vol. 17 (1988) [6] Dan Gusfield. Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology . Cambridge Univer sity Press (1997)
[7] Michael A. Bender, Mar tin Far ach-Colton. The Level Ancestor Problem sim pl i fied .
Theor. Com put. Sci. 321 (2004) [8] Daniel D. Sleator, R ober t E. Tarjan. A Data Structure for Dinamic Trees . Journal of
Com puter and System Sciences, 26(3) (1983) [9] R ober t E. Tarjan, Uzi Vishkin. Finding Biconnected Components and Computing T r ee Functions in Logarithmic Parallel Time. Proc. 25th Annual Symposium on Founda-
tions of Com puter Science (FOCS 1984). [10] David E ppstein, Michael T. Goodrigh. Succinct Greedy Graph Drawing in the H y perbolic Plane. Proc. of the 16th Inter nat ional Symposium on Graph Drawing (2008) [11] Michael T. Goodrich, Darren Str ash. Succinct Greedy Geometric Routing in the E uclidean Plane. Proc. 20th Inter national Symposium on Algor ithms and Com putat ion (ISAAC 2009). Lectur e Notes in Com puter Science, vol. 5878 (2009) [12] Erik Demaine. Advanced Data Structures (MIT Lectur e Notes On LCA and R MQ Problems) (2003)
72