Algorytm Borůvki: Różnice pomiędzy wersjami
[wersja przejrzana] | [wersja przejrzana] |
Luckas-bot (dyskusja | edycje) m robot dodaje: cs, es, it, pt, ru |
Poprawiono niedziałający link |
||
Linia 48: | Linia 48: | ||
==Złożoność obliczeniowa== |
==Złożoność obliczeniowa== |
||
Łatwo udowodnić, że każdym kolejnym wywołaniu liczba wierzchołków zmaleje co najmniej dwukrotnie - zatem wywołań tych będzie co najwyżej <math>log(n)</math>. Złożoność obliczeniowa całości zależy więc od sposobu implementacji kroków 1,2 algorytmu. Zastosowanie w implementacji struktur [Union-find] pozwala osiągnąć złożoność na poziomie <math>O(log(n)*m)</math>. Można zmodyfikować go tak, aby osiągnąć złożoność <math>O(log(n)*m - n)</math> - algorytm działa wtedy znacznie szybciej dla grafów rzadkich; dla grafów gęstych modyfikacja nie daje dużych zysków czasowych. |
Łatwo udowodnić, że każdym kolejnym wywołaniu liczba wierzchołków zmaleje co najmniej dwukrotnie - zatem wywołań tych będzie co najwyżej <math>log(n)</math>. Złożoność obliczeniowa całości zależy więc od sposobu implementacji kroków 1,2 algorytmu. Zastosowanie w implementacji struktur [[Union-find]] pozwala osiągnąć złożoność na poziomie <math>O(log(n)*m)</math>. Można zmodyfikować go tak, aby osiągnąć złożoność <math>O(log(n)*m - n)</math> - algorytm działa wtedy znacznie szybciej dla grafów rzadkich; dla grafów gęstych modyfikacja nie daje dużych zysków czasowych. |
||
Wersja z 09:50, 25 maj 2010
Algorytm Borůvki wyznacza minimalne drzewo rozpinające dla grafu nieskierowanego ważonego, o ile jest on spójny. Innymi słowy, znajduje drzewo zawierające wszystkie wierzchołki grafu, którego waga jest najmniejsza możliwa. Jest to przykład algorytmu zachłannego.
Pierwszy raz opublikowany został w 1926 roku przez Otakara Borůvkę jako metoda efektywnej konstrukcji sieci energetycznych. Algorytm ten został potem ponownie wymyślony przez Choqueta w 1938, potem przez Florka, Łukasiewicza, Perkala, Steinhausa i Zubrzyckiego w 1951 i ostatecznie przez Sollina w latach 60. Ponieważ Sollin był jedynym zachodnim informatykiem wśród wymienionych tu osób, często algorytm jest nazywany jego nazwiskiem.
Algorytm
Algorytm działa poprawnie przy założeniu, że wszystkie krawędzie w grafie mają różne wagi. Jeśli tak nie jest, można np. przypisać każdej krawędzi unikalny indeks i jeśli dojdzie do porównania dwóch krawędzi o takich samych wagach, wybrać tę, która otrzymała niższy numer.
- Dla każdego wierzchołka v w grafie G przejrzyj zbiór incydentnych z nim krawędzi. Dołóż najlżejszą z nich do rozwiązania (zbioru E').
- Po tym etapie graf tymczasowego rozwiązania powinien zawierać nie więcej niż spójnych składowych. Utwórz graf G' w którym wierzchołki stanowiące spójne składowe zostaną ze sobą "sklejone" (nowe wierzchołki będziemy nazywać roboczo superwierzchołkami).
- Dopóki nie otrzymamy jednej spójnej składowej, wywołujemy kroki 1-2 za graf G podstawiając graf G'
Po zakończeniu algorytmu G' jest minimalnym drzewem rozpinającym.
Dowód poprawności
Lemat 1
W każdym momencie działania algorytmu, oraz po jego zakończeniu w E' nie będzie cyklu.
Dowód
Załóżmy nie wprost, że podczas działania algorytmu w którymś etapie pojawiła się spójna składowa, w której jest cykl. Oznaczmy ją jako S. Rozważmy następujące sytuacje:
- S powstała przez połączenie dwóch superwierzchołków v1 i v2. Oznacza to, że do zbioru E' zostały dołączone krawędzie ei i ej. Ponieważ ei została dołączona jako najlżejsza krawędź incydenta do v1 więc . Ale skoro ej została dołączona jako najlżejsza krawędź incydenta do v2 to musi zachodzić (Pamiętajmy, że w grafie nie ma krawędzi o takiej samej wadze) - sprzeczność.
- S powstała przez połączenie się trzech lub więcej superwierzchołków. Podzielmy powstały cykl C na następujące części: niech będą kolejnymi superwierzchołkami należącymi do C a będą kolejnymi krawędziami należącymi do C, które zostały dodane w zakończonym właśnie etapie algorytmu. W C krawędzie oraz superwierzchołki występują na przemian. Z zasady działania algorytmu możemy stwierdzić, że aby powstał taki cykl, musi zachodzić - Sprzeczność.
Lemat 2
W każdym etapie działania algorytmu otrzymujemy dla każdego superwierzchołka minimalne drzewo rozpinające
Dowód
Gdy zostanie zakończony etap 1 :
Załóżmy, że istnieje taki superwierzchołek , który nie jest minimalnym drzewem rozpinającym poddrzewa złożonego z wierzchołków należących do . Weźmy więc takie minimalne drzewo rozpinające T. Istnieje krawędź taka, że . Dodajmy . W T powstał cykl. Ponieważ jest incydenta do pewnego wierzchołka z tego cyklu, istnieje więc inna krawędź incydenta do tego samego wierzchołka. Jednak z tego, że wynika, że . Jeśli usuniemy krawędź z T otrzymamy mniejsze drzewo rozpinające, co jest sprzeczne z założeniem o minimalności T.
Gdy zostanie zakończony etap 2 :
Z poprawności etapu 1 wiemy, że istnieje takie wywołanie etapu 2, w którym każdy z superwierzchołków jest minimalnym drzewem rozpinającym. Jest to choćby pierwsze wywołanie. Załóżmy zatem, że dla pewnego wywołania tego etapu otrzymano superwierzchołki będące minimalnymi drzewami rozpinającymi, jednak scaliło przynajmniej dwa z nich w taki sposób, że dało się otrzymać mniejsze drzewo rozpinające. Niech etap k-ty będzie pierwszym takim etapem, w którym coś się popsuło. Niech będzie zbiorem krawędzi przed wywołaniem etapu k, a będzie zbiorem krawędzi po jego wywołaniu. Niech T będzie minimalnym drzewem rozpinającym takim, że , ale że . Istnieje więc krawędź
Fakt: Krawędź dodana podczas k-tego wywołania. (Nie może należeć do gdyż inaczej superwierzchołek do którego by należała nie byłby minimalnym drzewem rozpinającym, co jest sprzeczne z dowodem dla pierwszego etapu i założeniem, że wywołanie k-te jest najmniejszym wywołaniem, które zwróciło nieoptymalne drzewa)
Dodajmy krawędź do E(T). W T powstał cyl. Ponieważ jest najmniejszą krawędzią incydentną do pewnego superwierzchołka z tego cyklu, istnieje więc inna krawędź incydenta do tego samego superwierzchołka. Jednak jej waga jest większa niż waga krawędzi , zatem zastąpienie jej krawędzią da nam mniejsze drzewo rozpinające co jest sprzeczne z założeniem o optymalności T.
Złożoność obliczeniowa
Łatwo udowodnić, że każdym kolejnym wywołaniu liczba wierzchołków zmaleje co najmniej dwukrotnie - zatem wywołań tych będzie co najwyżej . Złożoność obliczeniowa całości zależy więc od sposobu implementacji kroków 1,2 algorytmu. Zastosowanie w implementacji struktur Union-find pozwala osiągnąć złożoność na poziomie . Można zmodyfikować go tak, aby osiągnąć złożoność - algorytm działa wtedy znacznie szybciej dla grafów rzadkich; dla grafów gęstych modyfikacja nie daje dużych zysków czasowych.
Zobacz też