Algorytmy i Struktury Danych, 5. ¢wiczenia
2009-11-10
1 Plan zaj¦¢
• izomorzm drzew,
• d-kopce,
2 Izomorzm drzew
Algorytm:
TreeIsomorphism(T1,T2,depth)
1: if T 1.height > depth then
2: return (T 1.height = T 2.height);
3: end if
4: if not TreeIsomorphism(T1,T2,depth+1) then
5: return false;
6: end if
7: for v ∈ T 1.nodes[depth + 1] ∪ T 2.nodes[depth + 1] do
8: {w porz¡dku rosn¡cych etykiet}
9: dodaj value(v) do listy wierzchoªka parent(v)
10: end for
11: posortuj leksykogracznie listy value(v) dla v ∈ T 1.nodes[depth]
12: posortuj leksykogracznie listy value(v) dla v ∈ T 2.nodes[depth]
13: porównaj czy listy s¡ identyczne, je±li nie to return false
14: zamie« etykiety value(v) na liczby z zakresu 1, . . . , n
15: return true
3 Izomorzm drzew algorytm dla drzew nie- skierowanych
Znajd¹ w drzewach centroidy (ka»de drzewo zawiera co najwy»ej 2 centroidy), dla ka»dej kombinacji ukorze« drzewa w centroidach i uruchom poprzedni algo- rytm.
Niech w(x) = max{|subtree(ti)| : ti ∈ adj(x)}. Centroid wierzchoªek o minimalnej wadze w(x).
Find(v)
1: niech c1, . . . , ck synowie wierzchoªka v,
1
2: je±li subtree(ci) ≤ n/2dla 1 ≤ i ≤ k, to return v,
3: wpp. niech cj wierzchoªek, taki, »e subtree(cj) > n/2(jest tylko jeden o tej wªasno±ci),
4: return Find(cj) FindCentroid(v)
1: ukorze« drzew w dowolnym wierzchoªku r,
2: oblicz warto±ci subtree(v) dla wszystkich wierzchoªków,
3: return Find(r)
4 d-kopce
dkopiec do drzewo zupeªne o stopniu d z porz¡dkiem kopcowym (min w korze- niu). Nale»y pokaza¢, »e poszczególne operacje wykonuje si¦ w czasie:
• Min O(1)
• DeleteMin O(d · logd(n))
• DecreaseKey O(logd(n))
Koszt implementacji algorytmu Dijkstry, przy u»yciu dkopców: O(nd · logd(n) + m · logd(n)).
Zanalizowa¢ jak nale»y dobra¢ d w zale»no±ci od m i n (je±li za d we¹miemy max(2, dm/ne)to dostajemy O(log m/nm log n)).
5 Rozgªaszanie komunikatów
Dane drzewo T , nale»y obliczy¢ czas potrzebny na przesªanie komunikatów do wszystkich w¦zªów drzewa. Przesªanie komunikatu po jednej kraw¦dzi zajmuje 1 jednostk¦ czasu.
Algorytm O(n log n):
• je±li wierzchoªek jest li±ciem to czas = 0,
• wpp. rekurencyjnie oblicz czas potrzebny na rozgªoszenie w poddrzewach,
• posortuj malej¡co otrzymane czasy: t1, . . . , tk
• czas = max{i + ti: 1 ≤ i ≤ k}
Aby otrzyma¢ algorytm O(n) trzeba sprytnie oblicza¢ warto±ci atrybutu czas.
• Q = {li±cie T },
• while root 6∈ Q do
x = Q.extractMin()
dodaj x.czas do kolejki parent(x),
je±li parent(x) ma ju» peªn¡ list¦ poddrzew, to policz parent(x).czas i dodaj parent(x) do kolejki.
Kolejk¦ Q mo»na zaimplementowa¢ w tablicy (ity element tablicy zawiera list¦
wierzchoªków o warto±ci x.czas = i). Sumarycznie operacje extractMin zajm¡
czas O(n). Dodawanie do kolejki zajmuje czas O(1).
2