11.3 Implementace Jarníkova algoritmu
- V Jarníkově algoritmu opakovaně vybíráme nejlehčí hranu a odstraňujeme ji ze seznamu.
- Z Přednášky 4 víme, že efektivní odebírání minim z dynamicky se měnící množiny dokáže binární halda.
-
Ukažme si nyní tedy implementaci pomocí binární haldy.
-
Vrcholy grafu \(G\) jsou udržovány v binární haldě \(H\) uspořádané podle hodnoty klíčů \(d\), určujících „vzdálenost“ vrcholů od dosud vybudovaného stromu v daném kroku algoritmu.
- Na počátku je \(d(v)\) nekonečno pro všechny vrcholy a zvolený \(v_0\) má nulu.
- Z haldy vybereme pomocí ExtractMin vrchol \(u\) s minimálním \(d\), čímž ho přidáme ke stromu a přepočteme pro jeho sousedy \(v\) vzdálenosti \(d\).
- Pokud se jejich \(d\) změnilo, pomocí DecreaseKey aktualizujeme haldu a vrchol \(u\) se stává jejich předchůdcem.
- Minimum aktualizované haldy je rovno váze nejlehčí hrany v elementárním řezu mezi novým \(T\) a zbytkem grafu.
Věta 11.5 (o časové složitosti Jarníkova algoritmu s binární haldou)
Časová složitost MinKostraJarník při použití binární haldy je \(O(|E|\ \log|V|)\).
Důkaz věty 11.5
- Inicializace zabere \(O(|V|)\).
- Operace s binární haldou:
- Provedeme \(|V| − 1\) krát operaci HeapExtractMin – celkem \(O(|V|\ \log|V|)\).
- Každá hrana může způsobit volání operace HeapDecreaseKey – celkem \(O(|E|\ \log |V|)\).
Dohromady dostáváme \(O(|V|) + O(|V|\ \log|V|) + O(|E|\ \log|V|) = O(|E|\ \log|V|)\).