Lyhyt MathCheck-ohje (uuteen välilehteen)
Tässä tehtävässä harjoitellaan algoritmeista päättelemistä käyttäen esimerkkinä tehokasta algoritmia, joka löytää lyhimmän ajoreitin. Päättelyt puretaan pieniksi askeliksi, jotta sellaiset tärkeät pikkuasiat tulisivat näkyviksi, jotka usein oletetaan jo osatuiksi ja siksi ohitetaan nopeasti.
Tässä tehtävässä MathCheckiä käytetään toisinaan sillä tavalla väärin, että kysymyksessä esiintyvän tiedon tyyppi on jotakin muuta kuin mitä MathCheck luulee. Siksi virheilmoitukset voivat joskus olla kummallisia. Esimerkiksi jos kysytään, kuinka monta alkiota on joukossa Q, niin oikea vastaus on |Q|. MathCheck voidaan laittaa tarkastamaan, että vastaus on |Q|. Kuitenkin MathCheckille Q on luku, joten jos opiskelijan vastaus on väärin, niin MathCheck antaa vastaesimerkissä Q:lle lukuarvon, kun pitäisi antaa joukko.
Kaikki kartan tiedot eivät ole olennaisia lyhimmän ajoreitin etsimisen kannalta. Olennaiset tiedot voidaan esittää solmuista ja kaarista koostuvana rakenteena seuraavasti:
Kaaret ovat yksisuuntaisia, koska …tienpätkät voivat olla yksisuuntaisia, kuten liittymien rampit ja yksisuuntaiset kadut kaupungeissa. Kaksisuuntainen tienpätkä esitetään näinkahdella kaarella, yksi kumpaankin suuntaan.
Reittien pituuksista puhuttaessa käytämme symbolia ∞ (reaalilukujen ääretön) tarkoittamaan, että puheena olevien solmujen välille ei ole vielä löydetty yhtään reittiä puheena olevaan suuntaan. Suuruusjärjestysvertailuissa ∞ tulkitaan …suuremmaksi kuin mikään luku. Sen ansiosta, kun verrataan juuri löydettyä reittiä parhaaseen jo tunnettuun, ei tarvita monimutkaista muotoa ”jos tätä ennen ei ole löydetty mitään reittiä tai jos nyt löydetty on lyhyempi kuin lyhyin aikaisemmin löydetty”, vaan tämäjos nyt löydetty on lyhyempi kuin lyhyin aikaisemmin löydetty yksinkertaisempi vertailu riittää.
Algoritmi etsii mahdollisimman lyhyen reitin solmusta l (lähtö) solmuun m (maali). Jokaiseen solmuun w liittyy viisi tietoa, joista kaksi ensimmäistä eivät voi muuttua algoritmin suorituksen aikana:
w↑kaaret | solmusta naapureihin vievät kaaret; joukko pareja muotoa (u, p), missä u on osoitin kaaren määränpääsolmuun ja p on kaaren pituus (palaamme kohta siihen, miten ja miksi tämä on erilainen kuin edellä mainittu E) |
w↑a | arvio matkalle solmusta maaliin (lisätietoa jäljempänä); luku |
w↑k | kertoo, onko solmu käsitelty; F tai T; alussa F |
w↑d | etäisyys lähdöstä solmuun parasta jo löydettyä reittiä pitkin; ei-negatiivinen luku tai ∞; alussa ∞ |
w↑e | edeltävä solmu reitillä, jota pitkin solmu löytyi |
Se, mikä esitettiin edellä w↑k, esitetään C-kielessä w->k. C:n tapa olisi tehnyt kaavoista sekavan näköisiä. Valittu esitystapa muistuttaa Pascalin syntaksia w^k.
Algoritmissa esiintyvät solmut voidaan toteuttaa monella tavalla. Tekstin pitämiseksi yksinkertaisena oletamme jatkossa, että ne on toteutettu tietueina tai olioina, joihin viitataan osoittimilla. Jos osoittimet eivät ole tuttu asia, lue tämä.Osoitin on ikään kuin osoite: se on tieto joka kertoo, mistä jokin tieto löytyy. Eiffel-torni sijaitsee osoitteessa Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France. Sijoitus u↑e := v on rinnastettavissa siihen, että kopioidaan tekstinpätkä ”Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France” paikkaan u↑e sen sijaan että paikkaan u↑e rakennettaisiin kopio Eiffel-tornista. (Jälkimmäistäkin harrastetaan.) Vaikka esimerkki on hassu, se kuvastaa silti sekä osoittimien toimintaa että niiden käytöllä saavutettavissa olevia hyötyjä. Esimerkiksi w tarkoittaa osoitinta ja w↑k erästä osoittimen w takaa löytyvän tietueen kenttää. Tärkeää on, että sijoitus u↑e := v ei tarkoita solmun v kaikkien tietojen kopiointia paikkaan u↑e, vaan todellakin esimerkiksi solmuun v kohdistuvan osoittimen kopiointia.
Sama informaatio voidaan usein esittää eri tavoilla. Se, mikä on kätevintä matematiikassa, ei välttämättä ole paras tapa ohjelmoinnissa. Esitystavat esittävät saman informaation, jos ja vain jos niiden välillä on sellaiset muunnokset kumpaankin suuntaan, että kun aloitetaan ensimmäisestä esitystavasta, muunnetaan toiseen esitystapaan, ja muunnetaan ensimmäiseen esitystapaan, niin saadaan se mistä aloitettiin; ja kun aloitetaan toisesta esitystavasta, muunnetaan ensimmäiseen esitystapaan, ja muunnetaan toiseen esitystapaan, niin saadaan se mistä aloitettiin. Luvussa 1 ja tässä luvussa käytettyjen esitystapojen tapauksessa nämä muunnokset ovat:
E = { (w, u, p) | w ∈ V ∧ (u, p) ∈ w↑kaaret }
Jos w ∈ V, niin w↑kaaret = …{ (u, p) | (w, u, p) ∈ E }
Q on prioriteettijono, eli tietorakenne, joka tarjoaa kaksi palvelua: alkion lisäämisen ja prioriteetiltaan mahdollisimman suuren alkion poistamisen. Tässä tapauksessa lisättävät alkiot ovat pareja, jotka koostuvat osoittimesta solmuun ja luvusta. Alkion prioriteetti on sitä suurempi, mitä pienempi siihen kuuluva luku on. Toiminto (v, x) := Q.poista_eka() valitsee alkion, jonka luku on mahdollisimman pieni, sijoittaa osoittimen muuttujaan v ja luvun muuttujaan x sekä poistaa alkion Q:sta.
Miksi edellä sanottiin ”prioriteetiltaan mahdollisimman suuren” eikä ”prioriteetiltaan suurimman”? vastausVoi olla, että monella alkiolla on sama prioriteetti, jota suurempaa prioriteettia ei ole millään alkiolla. Esimerkiksi lähdön ja maalin välillä voi olla kaksi yhtä lyhyttä reittiä, joita lyhyempiä reittejä ei ole.
Alussa Q on tyhjä. Q:n toteutusta käsitellään himpun verran luvussa 9. Toteutusyksityiskohdista. |Q| tarkoittaa Q:ssa olevien alkioiden määrää.
1 l↑d := 0
2 Q.lisää(l, l↑a)
3 v := l
4 while |Q| ≠ 0 ∧ v ≠ m do
5 (v, x) := Q.poista_eka()
6 if ¬v↑k then
7 v↑k := T
8 for (u, p) ∈ v↑kaaret do
9 if u↑d > v↑d + p then
10 u↑d := v↑d + p
11 u↑e := v
12 Q.lisää(u, u↑d + u↑a)
Vaikka et vielä ymmärtäisi juuri mitään algoritmin toiminnasta, voit silti helposti varmistua siitä, että minkään solmun ↑kaaret ja ↑a eivät muutu algoritmin suorituksen aikana. Miten?Algoritmi läpi silmäilemällä on helppo varmistua, että missään ei ole sijoitusta, joka kohdistuu minkään solmun kaaret-kenttään tai a-kenttään. Tämä kikka on usein hyödyllinen algoritmeihin tutustuttaessa.
Yleisessä tilanteessa on otettava huomioon mahdollisuus, että johonkin tietoon sijoitetaan jotain muuta saantipolkua käyttäen kuin tiedon ensisijaisella nimellä. Tämä on iso aihepiiri, johon ei voida tässä paneutua. Yhden esimerkin kuitenkin kerron: vaikka alussa l↑k = F eikä algoritmissa ole sijoitusta muotoa ”l↑k :=”, silti yhtä poikkeusta lukuun ottamatta lopussa pätee l↑k = T. Mikä on tämä poikkeustapaus? vastausJos l = m eli lähtö on sama kuin maali, niin algoritmi lopettaa kun riville 4 tullaan ensimmäisen kerran. Miksi muissa tapauksissa lopussa l↑k = T? vastausKun riville 4 tullaan ensimmäisen kerran, v = l ja Q sisältää (vain) parin (l, x) jollekin x. Jos l ≠ m, niin mennään silmukan sisään. Rivillä 5 sijoitetaan v:hen l, mikä ei muuta v:n eikä l↑k:n arvoa. Päädytään riville 7, jossa sijoitetaan l↑k := T.
Tässä algoritmissa on muitakin muuttujia ja/tai kenttiä, joiden arvo ei missään tilanteessa muutu. Mitkä?l ja m eli lähtö ja maali.
Edellä todetusta seuraa myös, että rivin 12 alussa u↑d ≠ ∞. Syy on tämäRiville 12 ei tulla, ellei rivillä 9 todettu, että u↑d:hen sijoitettavaksi tarkoitettu arvo on u↑d:n aikaisempaa arvoa pienempi. Koska ∞ on suurin mahdollinen arvo, se ei voi olla aikaisempaa arvoa pienempi..
Olkoon w mikä tahansa solmu. Sanomme, että algoritmi löytää w:n sillä hetkellä kun w↑d lakkaa olemasta ∞. Jokainen solmu on alussa löytämättä, koska luvussa 2 kerrottiin, että w↑d on aluksi ∞. Löytynyt solmu ei voi muuttua takaisin löytämättömäksi. Miksi?Edellä näimme, että w↑d ei voi kasvaa. Siksi w↑d ei voi palata takaisin arvoon, joka sillä on aiemmin ollut mutta ei ole enää.
Kuten edellä todettiin, Q ei sisällä solmuja eikä osoittimia solmuihin vaan pareja (w, x), missä w on osoitin solmuun ja x on luku. Tällaisista pareista puhuminen olisi kuitenkin jatkossa usein kömpelöä. Siksi sovimme, että ilmaus ”w on Q:ssa” tarkoittaa, että on olemassa sellainen x, että (w, x) on Q:ssa.
Seuraava väite pätee koko ajan. Miksi?Luvussa 2 luvattiin, että alussa Q on tyhjä. Siksi alussa mikään solmu ei ole eikä ole ollut Q:ssa, joten väite pätee. Solmuja lisätään Q:hun vain riveillä 2 ja 12. Kummassakin tapauksessa on edeltävillä riveillä varmistettu, että solmun d-kentän arvo ei ole ∞. Kuten edellä todettiin, se ei voi palata arvoon ∞.
Jokaiselle solmulle w, joka on tai on ollut Q:ssa, pätee w↑d ≠ ∞.
Kun sanomme, että solmu käsitellään, tarkoitamme, että rivit 7, …, 12 suoritetaan siten, että v osoittaa ko. solmuun. Vaikka et vielä ymmärtäisi juuri mitään algoritmin toiminnasta, voit silti helposti varmistua siitä, että kukin solmu käsitellään enintään kerran. Miten?Rivin 6 vuoksi solmu käsitellään vain, jos sen k-kentän arvo on F. Rivin 7 vuoksi k-kentän arvoksi tulee T. Missään ei ole lausetta, joka voisi muuttaa k-kentän arvon takaisin F:ksi, joten solmu ei voi läpäistä rivin 6 testiä toista kertaa.
Seuraavaksi varmistamme, siltä osin kuin asian varmistaminen kuuluu algoritmisuunnittelun piiriin, että algoritmi ei milloinkaan yritä suorittaa laitonta toimintoa, kuten nollalla jakamista.
Osoittimet l, m, u ja v osoittavat aina solmuihin (eli eivät voi saada arvoa nil). Algoritmi ei itse käytä e-kenttiä. Siksi mikään kenttien valinta operaattorilla ↑ ei ole laiton.
Rivien 1, 3, 7 ja 11 sijoituslauseet eivät voi olla laittomia.
Lisättäessä solmuja Q:hun riveillä 2 ja 12 muisti voi loppua kesken. Tämä on tärkeä asia, mutta hoidetaan yleensä muualla kuin algoritmisuunnittelussa tai jätetään kokonaan hoitamatta.
Rivien 4, 6 ja 8 testit ja samalla koko rivit ovat ongelmattomia.
Tietorakenteesta poistaminen on laiton toiminto, jos …tietorakenne on tyhjä. Rivillä 5 tätä vaaraa ei kuitenkaan ole, koska …Edellisellä rivillä varmistettiin, että Q ei ole tyhjä.
Yhteenlaskussa on vaarana, että lukualue ylittyy. Tämäkin hoidetaan yleensä muualla kuin algoritmisuunnittelussa tai jätetään kokonaan hoitamatta, vilkaise Extra, Extra - Read All About It: Nearly All Binary Searches and Mergesorts are Broken.
Tässä tapauksessa kaksi yksityiskohtaa kuitenkin kuuluu algoritmisuunnittelun piiriin.
Voiko algoritmi yrittää yhteenlaskua siten, että ainakin toinen yhteenlaskettavista on ∞? Mehän olemme lisänneet arvon ∞ d-kentille laillisten arvojen joukkoon, joten on meidän vastuullamme, että ∞ ei päädy osaksi laskutoimituksia. Se ei päädy, koska …Riveillä 9 ja 10 yhteenlaskuun osallistuvat vain v↑d ja p. Näistä p on kaaren pituus ja siksi luvun 1 mukaan luku. Myös v↑d on luku, koska rivin 5 perusteella v on tai on ollut Q:ssa, ja osoitimme luvussa 3, että sellaisten solmujen d-kentät ovat lukuja. Rivillä 12 yhteenlaskuun osallistuvat vain u↑d ja u↑a. Luvussa 3 todettiin, että rivin 12 alussa u↑d on luku. (Saman voi päätellä siitä, että rivin 10 yhteenlasku on laillinen.) Luvussa 2 luvattiin, että myös u↑a on luku. Sama ongelma ei koske vertaamista arvoon ∞ siksi, että …Luvussa 1 määriteltiin mitä se tarkoittaa, joten algoritmin toteuttaja tietää asiasta ja hänellä on velvollisuus toteuttaa vertailut sen mukaisesti. Niinpä myös rivit 9, 10 ja 12 ovat kunnossa.
Voiko d-kenttään päätyä negatiivinen luku, vastoin luvussa 2 sanottua? Tämä ei aiheuta paljoa päänsärkyä. VastausRivillä 1 selvästikään ei voi. Rivillä 10 sijoitettava arvo on ei-negatiivisten lukujen summana ei-negatiivinen. Muualla d-kenttien arvot eivät muutu.
Algoritmi ei siis voi jäädä kiertämään ikuisesti while-silmukkaansa. Se ei voi jäädä kiertämään ikuisesti for-silmukkaansakaan, koska se kiertää kerrallaan vain |v↑kaaret| kierrosta. Algoritmissa ei ole rekursiota eikä muutakaan, joka voisi johtaa päättymättömään suoritukseen. Olemme todistaneet, että algoritmi pysähtyy varmasti.
Seuraavaksi todistamme, että seuraava väite on aina voimassa:
Jokaiselle löytyneelle solmulle w (eli jos w↑d ≠ ∞) on olemassa reitti l:stä w:hen, jonka pituus on w↑d.
Todistus koostuu kahdesta osasta: (1) todistetaan, että väite on voimassa alussa (siis ennen rivin 1 suoritusta), ja (2) että minkään lauseen suoritus ei saata väitettä ensimmäisen kerran pois voimasta. Tämä riittää, koska jos ei ole ensimmäistä kertaa jolloin väite lakkaa olemasta voimassa, niin ei voi olla toista, kolmatta eikä muitakaan kertoja, joten väite ei koskaan lakkaa olemasta voimassa. Koska osassa (2) puhutaan ensimmäisestä kerrasta, sitä todistettaessa saa olettaa, että väite oli voimassa juuri ennen lauseen suoritusta ja on ollut voimassa sitä ennen koko ajan.
Mitkä rivit voivat muuttaa niiden arvoa? Vastausl:n ja kaaret-kenttien arvoja ei muuta mikään rivi. d-kentät voivat muuttua riveillä 1 ja 10. Näistä ensimmäisen suoritus ei voi rikkoa väitettä, koska …Solmusta l pääsee itseensä pysymällä paikallaan eli kulkemalla reitti, jonka pituus on 0. Rivillä 1 asetetaan l↑d sen mukaisesti. Siksi väite on voimassa l:lle rivin 1 lopussa. Muiden solmujen osalta väite säilyy voimassa, koska rivi 1 ei muuta mitään niiden kannalta. Jälkimmäisenkään suoritus ei voi rikkoa väitettä, koska …Rivin 5 perusteella v on ollut Q:ssa, joten luvussa 3 todistetun väitteen perusteella v↑d ≠ ∞. Edellä annettiin lupa olettaa, että todistettava väite päti rivin 10 alussa. Saamme siitä, että v↑d on jonkin l:stä v:hen vievän reitin pituus. Kun tämän reitin perään lisätään rivillä 8 tarkasteltavaksi otettu v:stä u:hun vievä kaari, saadaan reitti l:stä u:hun, jonka pituus on v↑d + p. Koska juuri tämä arvo sijoitetaan u↑d:hen rivillä 10, on u↑d:n arvo rivin 10 lopussa jonkin l:stä u:hun vievän reitin pituus. Siksi väite on voimassa u:lle rivin 10 lopussa. Muiden solmujen osalta väite säilyy voimassa, koska rivi 10 ei muuta mitään niiden kannalta.
Invariantti tarkoittaa väitettä, joka voidaan todistaa tällä kaksiosaisella tavalla. Edellä todistamamme väite on siis invariantti. Usein invariantin luvataan olevan voimassa vain jossakin tietyssä kohdassa ohjelmaa (esimerkiksi aina rivin 4 alussa), mutta tällä kertaa sen luvataan olevan voimassa joka kohdassa.
Algoritmin löytämä reitti on kirjattu takaperin e-kenttiin. Toisin sanoen, m↑e kertoo reitin toiseksi viimeisen solmun, sen e-kenttä kertoo reitin kolmanneksi viimeisen solmun ja niin edelleen lähtösolmuun saakka. Takaperin olevan reitin kääntäminen oikeinpäin ei ole työlästä, mutta vielä helpompaa on välttää se kokonaan. Se onnistuu yksinkertaisella kikalla, joka on …Esitetään kaaret kartassa takaperin, ja etsitään reitti maalista lähtöön.
Lähtösolmun e-kentän arvoa ei ole asetettu, joten löydettyä reittiä jälkikäsittelevän silmukan loppuehtona on oltava, että nykyinen solmu on l, eikä että e-kentän arvo on osoitin ei minnekään. Jos tämä ei ole sinusta hyvä, lisää algoritmiin sijoitus l↑e := osoitin ei minnekään.
Vielä täytyy todistaa, että algoritmin löytämä reitti on niin lyhyt kuin mahdollista. Sitä varten on puhuttava a-kenttien arvoista. Algoritmin toiminta perustuu oletukseen, että ne noudattavat seuraavaa ehtoa jokaiselle solmulle u ja v:
Jos (u, p) ∈ v↑kaaret, niin v↑a ≤ p + u↑a.
Toisin sanoen, jos solmusta v on kaari solmuun u, niin v:n arvioitu matka maaliin saa olla korkeintaan yhtä pitkä kuin on matka v:stä u:hun jatkettuna arvioidulla matkalla u:sta maaliin. Tämän ehdon oikeutus on kahdessa seikassa:
Hyvin helppo käyttökelpoinen arvio on valita v↑a = 0 jokaiselle solmulle v. Se täyttää edellä mainitun ehdon, koska …ehto pelkistyy muotoon 0 ≤ p + 0 eli p ≥ 0, joka toteutuu, koska luvussa 1 ilmoitettiin, että kaarten pituudet ovat ei-negatiivisia. Tällä valinnalla algoritmi tunnetaan nimellä Dijkstran algoritmi.
Toinen, todellisille maantiekartoille käyttökelpoinen ja usein hyvä arvio on linnuntie-etäisyys eli etäisyys suoraa viivaa pitkin. Paikkojen (x, y) ja (X, Y) välinen linnuntie-etäisyys voidaan laskea lausekkeella
√(X − x)2 + (Y − y)2 .
Se on lyhin mahdollinen etäisyys kahden paikan välillä, jos kulkeminen sallitaan myös muuten kuin kaaria pitkin. Edellä mainittu ehto v↑a ≤ p + u↑a pätee, koska …v↑a on lyhin mahdollinen etäisyys v:stä maaliin, ja v:stä u:hun vievää kaarta pitkin ja sen jälkeen linnuntietä u:sta maaliin mitattu etäisyys on jokin mahdollinen etäisyys v:stä maaliin, joten jälkimmäinen on vähintään yhtä pitkä kuin edellinen.
v0↑a ≤ p1 + v1↑a, joten v0↑a ≤ p1 + v1↑a |
v1↑a ≤ p2 + v2↑a, joten v0↑a ≤ p1 + p2 + v2↑a |
v2↑a ≤ p3 + v3↑a, joten v0↑a ≤ p1 + p2 + p3 + v3↑a |
Jos w on solmu, niin tarkoittakoon δ(w) mahdollisimman lyhyen l:stä w:hen vievän reitin pituutta. Jos ei ole olemassa reittiä l:stä w:hen, niin δ(w) = ∞. Koska …luvussa 6 osoitettiin, että w↑d on jonkin l:stä w:hen vievän reitin pituus tai ∞, pätee w↑d ≥ δ(w). Luvussa 3 todettiin, että w↑d ei koskaan kasva. Muistamme, että solmun käsittely tarkoittaa rivien 7, …, 12 suorittamista sille.
Näillä eväillä todistamme, että seuraava väite on algoritmin invariantti:
Jokaiselle solmulle w pätee, että jos w on käsitelty, niin w↑d = δ(w).
Alussa tämä pätee, koska …alussa mikään solmu ei ole käsitelty. Jos w↑d = δ(w), niin w↑d:n arvo ei voi enää muuttua, koska …w↑d ei koskaan kasva eikä voi olla pienempi kuin δ(w). Siksi invariantin voimassa säilymisen todistamiseksi riittää todistaa, että algoritmi käsittelee riveillä 7, …, 12 vain sellaisia solmuja w, joille w↑d = δ(w). Ennen kuin solmu käsitellään, se tulee ulos Q:sta rivillä 5. Siksi riittää todistaa, että mikään solmu w ei tule ulos Q:sta ennen kuin w↑d on pienentynyt arvoon δ(w). Teemme tämän todistamalla seuraavan:
Jos suoritus on rivin 5 alussa ja w↑d ≠ δ(w), niin Q:sta seuraavaksi tuleva solmu ei ole w.
Ensin osoitamme, että on olemassa reitti l:stä w:hen. Se pätee, koska …Koska w↑d ≥ δ(w) ja w↑d ≠ δ(w), pätee w↑d > δ(w). Koska w↑d voi olla vain luku tai ∞, siitä seuraa, että δ(w) < ∞ eli reitti on olemassa. Tämän voi todistaa myös siten, että jos reittiä ei ole, niin δ(w) = ∞ ja luvun 6 nojalla w↑d = ∞, mikä on ristiriidassa oletuksen w↑d ≠ δ(w) kanssa. Koska on olemassa reitti (ja koska kartta on äärellinen koska se on algoritmin syöte), on olemassa myös mahdollisimman lyhyt reitti eli sellainen, jonka pituus on δ(w). Olkoon t sen ensimmäinen käsittelemätön solmu. Sellainen on olemassa, koska …Ainakin w on käsittelemätön, koska muutoin invariantin mukaan oletus w↑d ≠ δ(w) ei pätisi. Invarianttiinhan saa vedota tilanteessa ennen tutkittavien lauseiden eli tässä tapauksessa rivien 5, …, 12 suoritusta.
Jos t = l, niin l on käsittelemättä, koska …t valittiin siten, että se on käsittelemättä. Niinpä rivin 5 alussa ollaan ensimmäistä kertaa ja Q:sta tulee seuraavaksi l. Se ei ole w, koska …silloin l↑d = 0 = δ(l), mutta oletimme, että w↑d ≠ δ(w).
Muussa tapauksessa t ei ole tarkasteltavan reitin ensimmäinen solmu. Olkoon edeltävän solmun nimi s. Se on käsitelty, koska …t on reitin ensimmäinen käsittelemätön solmu. Koska s on käsitelty, s↑d = δ(s) invariantin vuoksi. Olkoon p lyhimmän s:stä t:hen vievän kaaren pituus. Kun s käsiteltiin, tämä kaari tutkittiin ja laskettiin s↑d + p eli δ(s) + p. Koska …ko. kaari on osa mahdollisimman lyhyttä reittiä l:stä w:hen, δ(s) + p = δ(t). Siksi viimeistään silloin sijoitettiin t↑d:hen δ(t) ja lisättiin (t, δ(t) + t↑a) Q:hun.
Koska …t ei ole käsitelty, (t, δ(t) + t↑a) on yhä Q:ssa. Olkoon q t:stä w:hen vievän mahdollisimman lyhyen reitin pituus. Tässä luvussa todistamamme perusteella t↑a ≤ q + w↑a. Siitä seuraa δ(t) + t↑a ≤ δ(t) + q + w↑a = δ(t) + q = δ(w), koska ollaan mahdollisimman lyhyellä reitillä l:stä w:hen.δ(w) + w↑a. Saimme δ(w) + w↑a ≥ δ(t) + t↑a. Jos (w, x) on Q:ssa, niin x ≥ Kun (w, x) lisättiin Q:hun päti x = w↑d + w↑a. Sen jälkeen w↑a ei ole muuttunut ja w↑d on voinut pienentyä tai pysyä ennallaan, mutta ei ole kasvanut.w↑d + w↑a > Oletimme w↑d ≠ δ(w), ja näimme jo aiemmin että siitä seuraa w↑d > δ(w).δ(w) + w↑a ≥ δ(t) + t↑a. Siksi δ(t) + t↑a < x, joten t tulee Q:sta ennen w:tä.
Siksi algoritmin löytämät reitit ovat mahdollisimman lyhyitä.
Prioriteettijonon Q toteutus on kriittinen algoritmin nopeuden kannalta. Ongelmana on toteuttaa se siten, että sekä lisäys että ensimmäisen poistaminen tapahtuvat nopeasti. Tähän tarkoitukseen sopii hyvin tietorakenne, joka tunnetaan nimellä keko. Sen avulla sekä lisäys että poisto onnistuvat ajassa log |Q|.
Muut algoritmin operaatiot kuin Q:hun lisääminen ja poisto on helppo toteuttaa vakioaikaisina. Todellisessa toteutuksessa k- ja d-kentät on alustettava ennen riviä 1, mistä tulee suoritusaikaan komponentti O(|V|). Rivit 9, …, 12 suoritetaan korkeintaan kerran jokaista kaarta kohden, joten keon kooksi voi tulla korkeintaan |E|. Mitään riviä ei suoriteta useammin kuin |E| + 1 kertaa, joten kekoa käyttäen algoritmin suoritusaika on O(|V| + |E| log |E|).
Suoritusaika on lähellä tätä ylärajaa esimerkiksi silloin, kun kaikki ne kaaret, jotka eivät ole lyhimmällä reitillä lähdöstä maaliin, alkavat lähdöstä, ovat keskenään eripituisia ja pitempiä kuin lyhin reitti lähdöstä maaliin, ja lähdöstä alkavat kaaret tulevat syötteessä vastaan pituusjärjestyksessä pisin ensin. Tässä tapauksessa jokainen hyödytön kaari tuottaa heti alussa Q:hun alkion, joka pysyy siellä kunnes maali on löytynyt.
Sama solmu voi olla Q:ssa samanaikaisesti useaan kertaan. Näistä vain se esiintymä on hyödyllinen, johon liittyvä luku on pienin. Jos esiintymät poistettaisiin sitä mukaa kuin ne käyvät hyödyttömiksi, Q ei koskaan kasvaisi suuremmaksi kuin |V|. Keolla tämä on hankalaa, koska tavallisesta keosta on hankalaa löytää muuta alkiota kuin prioriteetissa ensimmäisenä oleva. Ongelma on kuitenkin ratkaistavissa, jolloin päästään suoritusaikaan O(|V| + |E| log |V|). On myös olemassa monimutkaisempi tietorakenne, jolla päästään vielä parempaan suoritusaikaan O(|E| + |V| log |V|). Näitten parannusten hyöty on tavallisen maantiekartan tapauksessa kyseenalainen, koska samaan risteykseen tulee harvoin kovin montaa tietä, joten |V| + |E| log |E| ei ole kovin paljon suurempi kuin |E| + |V| log |V|. Muissa sovelluksissa tilanne voi olla toinen.
Algoritmi käsittelee maalin turhaan (paitsi jos se on sama kuin lähtö). Se vältettäisiin, jos rivillä 4 olevan osatestin v ≠ m sijaan rivien 5 ja 6 välissä testattaisiin onko v = m ja jos vastaus on kyllä, niin hypättäisiin pois silmukasta. Pseudokoodiin sitä ei kirjoitettu niin, jotta ei olisi tarvinnut esitellä merkintää, jolla silmukasta hypätään pois keskeltä.