Johnsonův algoritmus

From Wikipedia, the free encyclopedia

Remove ads

Johnsonův algoritmus je algoritmus sloužící k hledání nejkratších cest mezi všemi uzly v ohodnoceném orientovaném grafu, který může mít záporně ohodnocené hrany. V řídkých grafech je rychlejší, než Floydův–Warshallův algoritmus. Johnsonův algoritmus dokáže rozpoznat záporný cyklus v grafu a výpočet ukončit. K tomu využívá Bellmanův-Fordův algoritmus, s jehož pomocí přehodnotí hrany tak, aby žádná neobsahovala zápornou hodnotu. Po přehodnocení hran používá Dijkstrův algoritmus k nalezení nejkratších cest mezi všemi uzly.

Johnsonův algoritmus je pojmenován po Donaldu B. Johnsonovi.

Remove ads

Popis algoritmu

Mějme orientovaný graf . Ohodnocení hran označíme jako . Graf může obsahovat záporně ohodnocené hrany.

Johnsonův algoritmus pracuje v několika fázích:

  • Ke grafu se přidá nový uzel Q, který se propojí se všemi ostatními uzly hranou s nulovým ohodnocením (s nulovou délkou) orientovanou od uzlu Q.
  • Vypočítá se pomocí Bellmanova-Fordova algoritmu nejkratší vzdálenost všech uzlů u ∈ U od pomocného uzlu Q. Tuto vzdálenost označme h(u). Pokud Bellmanův-Fordův algoritmus detekuje záporný cyklus v grafu, dojde k ukončení Johnsonova algoritmu
  • Přehodnotí se ohodnocení hran w(h) tak, aby nové ohodnocení neobsahovalo záporné hodnoty. Přehodnocení hran zachovává nejkratší cesty mezi všemi dvojicemi uzlů. (Hrana h je hrana z uzlu ui do uzlu uj.)

 

 

 

 

  • Odstraní se uzel Q.
  • Pomocí Dijkstrova algoritmu nad přehodnoceným grafem se vypočítají vzdálenosti mezi všemi uzly. Aplikuje se tedy Dijkstrův algoritmus na všechny uzly u ∈ U.
  • Pro výpočet původních vzdáleností v grafu lze aplikovat zpětnou transformaci na -vzdálenosti vygenerované Dijkstrovým algoritmem. (Zpětná transformace funguje i na cesty z ui do uj.)

 

 

 

 

Remove ads

Příklad

Další informace , ...
Remove ads

Složitost

Časová složitost

Pro řídké grafy předpokládáme, že počet hran |H| v úplném grafu o |U| uzlech platí, že:

Bellmanův-Fordův algoritmus má časovou složitost . Je tedy v kontextu Johnsonova algoritmu zanedbatelný. Stejně tak přehodnocení hran je se složitostí zanedbatelné.

Časově nejnáročnější složkou je opakovaný Dijkstrův algoritmus. V řídkých grafech lze efektivně implementovat prioritní frontu v Dijkstrově algoritmu pomocí Fibonacciho haldy. Taková implementace Dijkstrova algoritmu má pak časovou složitost pro výpočet vzdáleností z jednoho uzlu.

Celková asymptotická složitost Johnsonova algoritmu je tedy:

Floydův–Warshallův algoritmus řeší problém vyhledání nejkratších cest mezi všemi uzly grafu s časovou složitostí . Bellmanův-Fordův algoritmus pro všechny uzly pak se složitostí .

Paměťová složitost

Paměťová složitost Johnsonova algoritmu je . Zapotřebí je pouze matice vzdáleností mezi všemi uzly, případně navíc matice předchůdců.

Remove ads

Implementace

Ukázková implementace v Javě. K uložení vzdáleností se symbolicky používá mapa <Uzel z, Uzel do> → int.

// Ukazkova implementace Johnsonova algoritmu
// v 'symbolicke' Jave
Vzdalenosti2D<Uzel, Uzel> Johnson(Graf G){

    // Rozsireni grafu o uzel Q
    Uzel q = new Uzel();
    G.pridejUzel(q);
    for(Uzel b : G.uzly())
        G.pridejHranu(new Hrana(b,q));

    // Bellman-Ford z bodu Q
    Vzdalenosti<Uzel> bf = BellmanFord(G, q);
    if (bf == null)
        // Bellman-Ford nalezl zaporny cyklus
        return null;
    else {
        // Odstraneni uzlu Q
        G.odeberUzel(q);

        // Prehodncoeni hran
        for(Hrana h : G.hrany())
            h.hodnota = h.hodnota + bf.vzdalenost(h.from()) - bf.vzdalenost(h.to());

        // Dijkstruv algoritmus pro vsechny uzly
        Vzdalenosti2D<Uzel, Uzel> vz = new Vzdalenosti2D<Uzel, Uzel>();
        for(Uzel u : G.uzly())
            Dijkstra(G, u, vz); // Ulozi do vystupni struktury vzdalenosti z bodu u

        // Zpetne prehodnoceni
        for(Uzel u : G.uzly()){
            for(Uzel v : G.uzly()){
                vz.setHodnota(u, v, vz.hodnota(u,v)
                        - bf.vzdalenost(u) + bf.vzdalenost(v));
            }
        }
        return vz;
    }
}
Remove ads

Související články

Externí odkazy

Literatura

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads