Algorytm Borůvki

Sprzątanie Wikipedii
Ten artykuł należy dopracować:
od 2022-05 → zweryfikować treść i dodać przypisy,
od 2022-05 → usunąć/zweryfikować prawdopodobną twórczość własną.

Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się w dyskusji tego artykułu.
Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu.

Algorytm Borůvki – algorytm wyznaczający 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[1][2][3]. Algorytm ten został potem ponownie wymyślony przez Choqueta w 1938 r.[4], potem przez Florka, Łukasiewicza, Perkala, Steinhausa i Zubrzyckiego w 1951 r.[5] i ostatecznie w latach 60. przez Sollina[6], od którego nazwiska często jest on nazywany „algorytmem Sollina”.

Algorytm

Przykład działania algorytmu Borůvki

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 unikatowy 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.

  1. Dla każdego wierzchołka v {\displaystyle v} w grafie G {\displaystyle G} przejrzyj zbiór incydentnych z nim krawędzi. Dołóż najlżejszą z nich do rozwiązania (zbioru E {\displaystyle E'} ).
  2. Po tym etapie graf tymczasowego rozwiązania powinien zawierać nie więcej niż | V | 2 {\displaystyle {\frac {|V|}{2}}} spójnych składowych. Utwórz graf G {\displaystyle 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).
  3. Dopóki nie otrzymamy jednej spójnej składowej, wywołujemy kroki 1–2, za graf G {\displaystyle G} podstawiając graf G . {\displaystyle G'.}

Po zakończeniu algorytmu G {\displaystyle 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 {\displaystyle 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 . {\displaystyle S.} Rozważmy następujące sytuacje:

  • S {\displaystyle S} powstała przez połączenie dwóch superwierzchołków v 1 {\displaystyle v_{1}} i v 2 . {\displaystyle v_{2}.} Oznacza to, że do zbioru E {\displaystyle E'} zostały dołączone krawędzie e i {\displaystyle e_{i}} i e j . {\displaystyle e_{j}.} Ponieważ ei została dołączona jako najlżejsza krawędź incydentna do v 1 {\displaystyle v_{1}} więc C ( e i ) < C ( e j ) . {\displaystyle C(e_{i})<C(e_{j}).} Ale skoro ej została dołączona jako najlżejsza krawędź incydentna do v 2 {\displaystyle v_{2}} to musi zachodzić C ( e j ) < C ( e i ) {\displaystyle C(e_{j})<C(e_{i})} (Pamiętajmy, że w grafie nie ma krawędzi o takiej samej wadze) – sprzeczność.
  • S {\displaystyle S} powstała przez połączenie się trzech lub więcej superwierzchołków. Podzielmy powstały cykl C {\displaystyle C} na następujące części: niech v 1 , v 2 , v 3 , , v l {\displaystyle v_{1},v_{2},v_{3},\dots ,v_{l}} będą kolejnymi superwierzchołkami należącymi do C {\displaystyle C} a e 1 , e 2 , , e l {\displaystyle e_{1},e_{2},\dots ,e_{l}} będą kolejnymi krawędziami należącymi do C , {\displaystyle C,} które zostały dodane w zakończonym właśnie etapie algorytmu. W C {\displaystyle C} krawędzie e i {\displaystyle e_{i}} oraz superwierzchołki v i {\displaystyle v_{i}} występują na przemian. Z zasady działania algorytmu możemy stwierdzić, że aby powstał taki cykl, musi zachodzić C ( e 1 ) < C ( e 2 ) < < C ( e l 1 ) < C ( e l ) < C ( e 1 ) {\displaystyle C(e_{1})<C(e_{2})<\dots <C(e_{l-1})<C(e_{l})<C(e_{1})} – 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 V i , {\displaystyle V_{i},} który nie jest minimalnym drzewem rozpinającym poddrzewa złożonego z wierzchołków należących do V i . {\displaystyle V_{i}.} Weźmy więc takie minimalne drzewo rozpinające T . {\displaystyle T.} Istnieje krawędź e i {\displaystyle e_{i}} taka, że e i E ( V i ) e i E ( T ) . {\displaystyle e_{i}\in E(V_{i})\land e_{i}\not \in E(T).} Dodajmy e i . {\displaystyle e_{i}.} W T {\displaystyle T} powstał cykl. Ponieważ e i {\displaystyle e_{i}} jest incydenta do pewnego wierzchołka z tego cyklu, istnieje więc inna krawędź e i {\displaystyle e'_{i}} incydentna do tego samego wierzchołka. Jednak z tego, że e i E ( V i ) {\displaystyle e_{i}\in E(V_{i})} wynika, że C ( e i ) < C ( e i ) . {\displaystyle C(e_{i})<C(e'_{i}).} Jeśli usuniemy krawędź e i {\displaystyle e'_{i}} z T {\displaystyle T} otrzymamy mniejsze drzewo rozpinające, co jest sprzeczne z założeniem o minimalności T . {\displaystyle 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 {\displaystyle k} -ty będzie pierwszym takim etapem, w którym coś się popsuło. Niech E 1 {\displaystyle E'_{1}} będzie zbiorem krawędzi przed wywołaniem etapu k , {\displaystyle k,} a E 2 {\displaystyle E'_{2}} będzie zbiorem krawędzi po jego wywołaniu. Niech T {\displaystyle T} będzie minimalnym drzewem rozpinającym takim, że V ( T ) = V ( V i ) , {\displaystyle V(T)=V(V_{i}),} ale że E ( T ) E ( V i ) . {\displaystyle E(T)\not =E(V_{i}).} Istnieje więc krawędź e i E ( V i ) e i E ( T ) {\displaystyle e_{i}\in E(V_{i})\land e_{i}\not \in E(T)}

Fakt: Krawędź e i {\displaystyle e_{i}} została dodana podczas k {\displaystyle k} -tego wywołania. (Nie może należeć do E 1 , {\displaystyle E'_{1},} 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 {\displaystyle k} -te jest najmniejszym wywołaniem, które zwróciło nieoptymalne drzewa)

Dodajmy krawędź e i {\displaystyle e_{i}} do E ( T ) . {\displaystyle E(T).} W T {\displaystyle T} powstał cykl. Ponieważ e i {\displaystyle e_{i}} 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 e i , {\displaystyle e_{i},} zatem zastąpienie jej krawędzią e i {\displaystyle e_{i}} da nam mniejsze drzewo rozpinające co jest sprzeczne z założeniem o optymalności T . {\displaystyle T.}

Złożoność obliczeniowa

Można udowodnić, że każdym kolejnym wywołaniu liczba wierzchołków zmaleje co najmniej dwukrotnie – zatem wywołań tych będzie co najwyżej log V . {\displaystyle \log V.} Złożoność obliczeniowa całości zależy więc od sposobu implementacji kroków 1, 2 algorytmu. Zastosowanie w implementacji struktury zbiorów rozłącznych pozwala osiągnąć złożoność na poziomie O ( E log V ) . {\displaystyle O(E\log V).} Można zmodyfikować go tak, aby osiągnąć złożoność O ( E log V V ) {\displaystyle O(E\log V-V)} – 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ż

Przypisy

  1. OtakarO. Borůvka OtakarO., O jistém problému minimálním / Über ein Minimalproblem, „Práce Mor. Přírodověd. Spol. V Brně III”, 3, 1926, s. 37–58 [dostęp 2022-05-30]  (cz. • niem.).
  2. OtakarO. Borůvka OtakarO., Příspěvek k řešení otázky ekonomické stavby elektrovodních sítí, „Elektronický Obzor”, 15, 1926, s. 153–154  (cz.).
  3. JaroslavJ. Nešetřil JaroslavJ., EvaE. Milková EvaE., HelenaH. Nešetřilová HelenaH., Otakar Borůvka on minimum spanning tree problem Translation of both the 1926 papers, comments, history, „Discrete Mathematics”, 233 (1-3), 2001, s. 3–36, DOI: 10.1016/S0012-365X(00)00224-7 [dostęp 2022-05-30]  (ang.).
  4. GustaveG. Choquet GustaveG., Étude de certains réseaux de routes, „Comptes Rendus de l'Académie des Sciences”, 206, 1938, s. 310–313  (fr.).
  5. K.K. Florek K.K. i inni, Sur la liaison et la division des points d'un ensemble fini, „Colloquium Mathematicum”, 2 (3-4), 1951, s. 282–285 [dostęp 2022-05-30]  (fr.).
  6. GeorgesG. Sollin GeorgesG., Le tracé de canalisation, [w:] ClaudeC. Berge, AlainA. Ghouila-Houri (red.), Programming, Games, and Transportation Networks, John Wiley & Sons, 1965, LCCN 66001179, OCLC 564487249  (fr.).

Linki zewnętrzne

  • K.K. Loryś K.K., Algorytmy zachłanne. Notatka nr 2 do wykładu z algorytmów i struktur danych [plik PostScript], Instytut Informatyki UWr, 22 lutego 2006 [dostęp 2022-05-30] .