Skip to content

Latest commit

 

History

History
59 lines (40 loc) · 2.63 KB

johnson.md

File metadata and controls

59 lines (40 loc) · 2.63 KB

Johnsons algoritme

Johnsons algoritme kjører en kombinasjon av Bellman-Ford og Dijkstra. Det som er spesielt med denne algoritmen er hvordan den justerer kantvekter, selv når de er negative.

Algoritmen returnerer enten en matrise for alle korteste vei vektene for alle nodeparene eller rapporterer at det finnes negative sykler i grafen.

Hvis vi har få kanter og kun positive kanter lønner det seg å bruke Dijkstras algoritme fra alle nodene. Har vi derimot negative kanter og relativt få kanter er Johnsons algoritme løsningen.

Johnsons øker kantvektene, men vi kan ikke øke alle kantvektene med det største negative kantens vekt, da blir de nodene med mange kanter urettmessige "dyre". Vi er ikke garantert å bevare rangeringen av stiene om vi øker kantvektene med en konstant.

Johnsons implementerer løser dette ved å implementere en "teleskopsum". En sum som kollapser som et teleskop. Annenhvert ledd er minus det forrige. Vi ønsker at langs en hver sti skal ha en teleskopsum. Algoritmen tilordner hver node en verdi og så endrer vi kantvekten med differansen av de to verdiene. Kanten fra $u$ til $v$ oppdateres med differansen $h(u) - h(v)$. Slik vil positive og negative ledd oppheve hverandre:

Johnson sum

Den formelle definisjonen av det generelle problemet

Tilleggskrav for korrekthet

Trinn for trinn

  • Trinn 5-6 er der teleskopsummen implementeres
  • Trinn 7-11 er der matrisen med korteste vei fra alle til alle genereres. Johnson algorithm

Korrekthetsbevis

Styrker og svakheter sammenlignet med andre

Om det er relativt få kanter som er negative så er Johnsons et godt valg.

Kjøretid og utregning

Med Fibonacci-haug: $O(V^3)$

Med binære min-heap: $O(VElgV)$

$O(V^2 \log V + VE)$

Best case Average case Worst case Minne
TODO TODO $O(V^2 \log V + VE)$ TODO

Python kodeeksempel