Due compiti principali
Determinare la nostra posizione
Epicentro a 347 chilometri da Roma
Epicentro a 86 chilometri da Firenze
Epicentro a 280 chilometri da Milano
Mappa di Pisa
Voi siete qui
Grafo di Pisa
Correttezza
Efficienza (n indica il numero di nodi)
n | Numero operazioni | Tempo |
---|---|---|
10 | 1000 | 1𝜇s |
100 | 1000000 | 1ms |
1000 | 1000000000 | 1s |
10000 | 1000000000000 | 16.6m |
Con un calcolatore che esegue un miliardo di operazioni al secondo
Bisogna fare di meglio...
f = fill(false,7)
Array : sequenza lineare di valori
d = fill(typemax(Float64),7)
d[7] = 0
Array di valori di verità per indicare se nodo è stato analizzato
Array di numeri reali per memorizzare le distanze correnti
g = [0 6 0 0 0 0 0;
6 0 0 0 0 0 0;
4.5 4.5 0 0 0 0 0;
0 5 2.9 0 2.5 0 0;
0 0 6 2.5 0 3 9;
0 5 0 0 3 0 0;
0 0 0 0 9 0 0]
Array bidimensionale: tabella di valori
Array bidimensionale delle distanze tra i nodi
Struttura del programma
Programmazione procedurale
Funzione per trovare il nodo x più vicino alla sorgente e non ancora analizzato
function findMinimum(d,f,n)
min = typemax(Float64)
x = 0
for i = 1:n
if d[i] < min && f[i] == false
min = d[i]
x = i
end
end
return x
end
Funzione per aggiornare le distanze
function updateDistances(g,n,d,x)
for y = 1:n
if g[x,y]>0 && d[y]>d[x]+g[x,y]
d[y] = d[x]+g[x,y]
end
end
end
Funzione principale
function dijkstra(g,n,s,d,f)
for i = 1:n
x = findMinimum(d,f,n)
f[x] = true
updateDistances(g,n,d,x)
end
return d
end
d = dijkstra(g,n,s,d,f)
println(d)
[18.9, 16.5, 14.4, 11.5, 9.0, 12.0, 0.0]
produce