(U, V–U).

Transkrypt

(U, V–U).
Wykład 8
Drzewo rozpinające
(minimum spanning tree)
1
Minimalne drzewo rozpinające - przegląd
Definicja problemu
Własności minimalnych drzew rozpinających
Algorytm Kruskala
Algorytm Prima
Literatura
– Cormen, Leiserson, Rivest, “Wprowadzenie do algorytmów”, rozdz. 24
2
Problem
Mamy dany zbiór wierzchołków i możliwych połączeń wraz z ich
wagami, chcemy znaleźć taki podzbiór połączeń, żeby wszystkie
wierzchołki były połączone oraz suma wag tych połączeń była
minimalna.
Przykłady:
– Komutowanie łącza telefonicznego
– Tworzenie instalacji elektrycznej w budynku
Węzły wraz z wybranymi połączeniami tworzą drzewo!
Drzewo to nazywane jest MINIMALNYM DRZEWEM ROZPINAJĄCYM
(Minimum Spanning Tree – MST)
3
Przykład drzewa rozpinającego (to nie jest minimalne)
8
b
7
c
d
4
9
2
11
a
i
7
14
4
e
6
8
10
h
1
g
2
f
koszt: 51
4
Przykład drzewa rozpinającego (minimalne)
8
b
7
c
d
4
9
2
11
a
i
7
14
4
e
6
8
10
h
1
g
2
f
koszt: 37
5
Drzewa rozpinające
Definicja: niech G=(V,E) będzie ważonym i spójnym grafem
nieskierowanym. Drzewem rozpinającym dla G nazywamy podzbiór
krawędzi T ⊆ E, taki że podgraf G’=(V,T) jest grafem spójnym, nie
zawierającym cykli.
Minimalnym drzewem rozpinającym (MST) nazywamy drzewo
rozpinające, dla którego suma wag wszystkich krawędzi jest
minimalna :
w (T ) =
w (u ,v )
∑
( )
u ,v ∈T
6
Podstawowy algorytm MST
Strategia zachłanna: minimalne drzewo rozpinające rozrasta się poprzez
dołączanie do niego w każdym kroku jednej krawędzi, przy
jednoczesnym sprawdzaniu zachowania warunków( zachowanie
struktury drzewa i warunku minimalności
dodawana krawędź jest
„bezpieczna” – po jej dodaniu dalej dostajemy podzbiór minimalnego
drzewa).
Generic-MST(G=(V,E))
T = ∅;
while (T nie tworzy drzewa rozpinającego dla G) do
znajdź krawędź e=(u,v) ∈ E bezpieczną dla T
T = T ∪ {e}
return T
7
Własności MST
Pytanie: jak efektywnie odnaleźć tę bezpieczną krawędź?
Twierdzenie 1: niech U⊂
⊂V i e=(u,v) będzie krawędzią o minimalnej
wadze rozpoczynającą się w U i kończącą w V–U. Istnieje wtedy
minimalne drzewo rozpinające T, takie że e∈T.
U
T
V–U
V
8
Własności MST
podział
U
8
b
7
c
V–U
d
4
9
2
11
a
i
7
14
4
e
6
8
10
h
1
g
2
f
9
Własności MST
Twierdzenie 2: niech G=(V,E) będzie spójnym grafem nieskierowanym, A
podzbiorem E zawartym w pewnym minimalnym drzewie rozpinającym T
dla G. Niech (U, V–U) będzie przekrojem G względem A (nie ma krawędzi
dla wierzchołków ze zbioru A krzyżujących się z podziałem), i niech e=(u,v)
będzie krawędzią lekką (o minimalnej wadze) krzyżującą się z przekrojem
(U, V–U). Wtedy e jest bezpieczna dla A.
V
T
V–U
U
podział
10
Własności MST
Wniosek: niech G=(V,E) będzie spójnym grafem nieskierowanym, A
podzbiorem E zawartym w pewnym minimalnym drzewie
rozpinającym T dla G, niech dalej C = (VC, EC) będzie składową
(drzewem) w lesie GA = (V,A). Jeśli e jest lekką krawędzią łączącą C z
pewną inną składową w GA, wtedy e jest bezpieczne dla A.
Dowód: przekrój (VC, V–VC) uwzględnia A, i e jest krawędzią lekką dla
tego przekroju. Stad e jest bezpieczne.
11
Algorytmy wyznaczania MST
Wykorzystuje się dwa sposoby odnajdowania bezpiecznych krawędzi:
1.
Algorytm Kruskala: zbiór A jest lasem i dodawana bezpieczna
krawędź jest zawsze „najlżejszą” krawędzią w grafie łączącą dwa
rozdzielone poddrzewa z tego lasu (Tw. 2).
2.
Algorytm Prima: zbiór A jest drzewem, a dodawana bezpieczna
krawędź jest „najlżejszą” krawędzią łączącą A z wierzchołkiem
spoza A (Tw. 1).
12
Algorytm Kruskala
MST-Kruskal(G)
A∅
for każdy wierzchołek v∈
∈V do
Każdy wierzchołek
staje się osobnym
drzewem
Make-Set(v)
posortuj krawędzie z E niemalejąco względem wag
for każda krawędź e = (u,v)∈
∈E do
if Find-Set(u) ≠ Find-Set(v)
Drzewa są
rozdzielone
then
A  A ∪ {e}
Union(u,v)
return A
Łączymy drzewa
13
Przykład – alg. Kruskala
8
b
7
c
d
4
9
2
11
a
i
7X
8X
14
4
e
X6
10
h
1
g
2
f
koszt: 37
14
Analiza – alg. Kruskala
Poprawność: wynika wprost z Tw. 2.
Złożoność: zależy od implementacji operacji dla zbiorów rozłącznych! Dla
asymptotycznie najlepszej znanej dostajemy:
– Sortowanie krawędzi zajmuje O(|E| lg |E|).
– Pętla for przebiegająca zbiór krawędzi wykonuje dwie operacje Find-Set i
jedną Union. Może być to implementowane w czasie O(1).
Ostatecznie dostajemy: O(|E| lg |E|) = O(|E| lg |V|).
Dla implementacji naiwnej: O(|V| |E|
15
Algorytm Prima
MST-Prim(G, root)
for każdego v∈
∈V do
key(v)  ∞; π[v]  null
Zmniejszamy
Korzystamy zwartość
kolejki
priorytetowej
klucza
key(root)  0; Enqueue(Q,V)
while Q nie jest pusty do
u  Get-Min(Q)
for każdego v sąsiada u do
if v∈
∈Q i w(u,v) < key(v)
then π[v]  u
Zmniejszamy wartość
klucza
key(v)  w(u,v)
16
Przykład - algorytm Prima
∞
8
b
0 4
∞
11
a
∞
c
d
9
2
i
7
7
∞
14
4
∞
e
6
8
10
h
∞
1
g
∞
2
f
∞
koszt: 37
17
Analiza algorytmu Prima
Poprawność: wynika bezpośrednio z Twierdzenia 1.
Złożoność: zależy od implementacji kolejko priorytetowej, dla kopca
binarnego mamy:
– Budowa początkowego kopca – O(|V|).
– Extract-Min zajmuje O(lg |V|) dla każdego wierzchołka razem O(|V| lg |V|)
– Pętla for jest wykonywana w czasie O(|E|).
– Test „czy jest sąsiadem” zajmuje O(1). Zmniejszanie klucza – O(lg |V|).
Ostatecznie dostajemy: O(|V| lg |V| + |E| lg |V|) = O(|E| lg |V|).
18
Podsumowanie: MST
MST jest drzewem zawierającym wszystkie wierzchołki o minimalnym
koszcie
Stosuje się dwa zachłanne algorytmy dla znalezienia MST:
– Kruskala: oparty o krawędzie. Czas wykonania: O(|V| |E|).
– Prima: oparty o wierzchołki. Czas wykonania: O(|E| lg |V|).
Złożoność dla algorytmu Kruskala można poprawić przez zastosowanie
struktur Union-Find do O(|E| lg |V|),
Złożoność dla algorytmu Prima można poprawić przez zastosowanie
kopców Fibonacciego do O(|V| lg |V| + |E|).
19

Podobne dokumenty