Johnsons algoritme

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 7. november 2019; verifikation kræver 1 redigering .

Johnsons algoritme - giver dig mulighed for at finde de korteste veje mellem alle par af hjørner i en vægtet rettet graf . Denne algoritme virker, hvis grafen indeholder kanter med positiv eller negativ vægt, men der er ingen cyklusser med negativ vægt. Opkaldt efter D. B. Johnson , som udgav algoritmen i 1977.

Algoritme

Givet en graf med en vægtfunktion . Hvis vægten af ​​alle kanter i en graf er ikke-negative, kan du finde de korteste veje mellem alle par af hjørner ved at køre Dijkstras algoritme én gang for hvert hjørne. Hvis grafen indeholder kanter med negative vægte, men ingen cyklusser med negative vægte, kan et nyt sæt kanter med ikke-negative vægte beregnes, så den tidligere metode kan bruges. Det nye sæt bestående af kantvægte skal opfylde følgende egenskaber.

Bevarelse af korteste veje

Lemma (Ændring af vægt bevarer korteste veje). Lad være en vægtet rettet graf med en vægtfunktion , og lad  være en vilkårlig funktion, der kortlægger hjørner til reelle tal. For hver kant vi definerer

Lade være  en vilkårlig vej fra toppunkt til toppunkt . er den korteste vej med vægtfunktionen, hvis og kun hvis det er den korteste vej med vægtfunktionen , dvs. lighed er ækvivalent med lighed . Derudover indeholder en graf en cyklus med negativ vægt ved hjælp af en vægtfunktion, hvis og kun hvis den indeholder en cyklus med negativ vægt ved hjælp af en vægtfunktion .

Ændring i vægt

  1. For denne graf skal du oprette en ny graf , hvor , for nogle nye toppunkter , og .
  2. Lad os udvide vægtfunktionen på en sådan måde, at ligheden gælder for alle hjørner .
  3. Dernæst definerer vi for alle hjørner værdien og nye vægte for alle kanter .

Grundlæggende procedure

Johnsons algoritme bruger Bellman-Ford- algoritmen og Dijkstras algoritme , implementeret som underrutiner. Kanter gemmes som lister over tilstødende hjørner. Algoritmen returnerer en almindelig matrix med størrelse , hvor , eller giver en besked om, at inputgrafen indeholder en cyklus med negativ vægt.

Johnson's Algorithm Byg en graf, hvis Bellman_Ford = FALSE , så udskriv " Inputgrafen indeholder en cyklus med negativ vægt" returner ø for for hvert sæt værdien til , beregnet af Bellman-Ford algoritmen for for hver kant gør for for hvert toppunkt beregner Dijkstras algoritme værdier for alle toppunkter for for hvert toppunkt returnerer D

Sværhedsgrad

Hvis den ikke-faldende prioritetskø i Dijkstras algoritme er implementeret som en Fibonacci-heap , så er køretiden for Johnsons algoritme . Med en enklere implementering af en ikke-faldende prioritetskø bliver køretiden lig med , men for sparsomme grafer opfører denne værdi i den asymptotiske grænse sig bedre end køretiden for Floyd-Warshall-algoritmen .

Se også

Links

Litteratur