Sto cercando di implementare una versione di Dijkstra Algorithm per trovare il percorso più breve per un autobus da percorrere dall'inizio alla fine. Sfortunatamente, non riesco a trovare una libreria o altro modo in cui swift fornisca un tipo di coda di priorità, quindi sembra che dovrò codificarmi da solo.Coda prioritaria in swift
Detto questo, qualcuno può indicarmi la direzione giusta per farlo?
Attualmente il mio pensiero è il seguente:
scrivere una classe che conterrà la matrice di priorità. In questa classe ci sarà un metodo che riceve un valore, lo aggiunge alla matrice di priorità e poi lo ordina in base alla priorità (in questo caso, la distanza). Ci sarà anche una funzione get che restituisce l'elemento con la priorità più alta dall'array.
Mi piacerebbe sapere se sono vicino o ancora lontano dalla mia comprensione di una coda di priorità.
Grazie.
EDIT:
Questo è il mio codice finora. Sembra troppo breve e brutale ... Mi manca qualcosa in termini di concetto.
var priorityQueue = Dictionary<String, Int>()
var firstElement: String = ""
func push(name: String, distance: Int)
{
priorityQueue[name] = distance
var myArr = Array(priorityQueue.keys)
var sortedKeys = sort(myArr) {
var obj1 = self.priorityQueue[$0] // get obj associated w/ key 1
var obj2 = self.priorityQueue[$1] // get obj associated w/ key 2
return obj1 > obj2
}
firstElement = myArr[0]
var tempPriorityQueue = Dictionary<String, Int>()
for val in myArr
{
tempPriorityQueue[val] = priorityQueue[val]
}
priorityQueue = tempPriorityQueue
}
func pop() -> String
{
priorityQueue.removeValueForKey(firstElement)
}
Questo è approssimativamente corretto. Il metodo assumerà un valore e una chiave di priorità come argomenti.Troverà dove nella struttura interna dei dati che contiene le coppie per posizionarlo in base alla chiave di priorità. Ora pensa a come impostare questa struttura dati. Hai bisogno di una struttura dati facile da aggiungere nel mezzo, facile da rimuovere e facile da raggiungere all'inizio. Non devi necessariamente ordinare nulla se riesci a trovare dove mettere le coppie per iniziare (si ordinerà da sé). –
Scrivi del codice e pubblicalo per un feedback più utile. Ci sono anche molte risorse qui e online che hanno dettagli di implementazione. –
possibile duplicato di [algoritmo di Dijkstra con coda di priorità] (http://stackoverflow.com/questions/14959634/dijkstras-algorithm-with-priority-queue) – kurast