【发布时间】:2014-07-01 16:40:14
【问题描述】:
我正在尝试实现 Dijkstra 算法的一个版本,以找到公共汽车从头到尾的最短路线。不幸的是,我似乎找不到 swift 提供一种优先级队列的库或其他方式,所以看来我必须自己编写代码。
话虽如此,任何人都可以为我指出正确的方向吗?
目前我的想法如下:
编写一个保存优先级数组的类。在这个类中将有一个方法接收一个值,将其添加到优先级数组中,然后根据优先级(在本例中为距离)对其进行排序。还有一个 get 函数,它从数组中返回最高优先级的项目。
我想知道我对优先级队列的理解是否接近或仍然遥遥无期。
谢谢。
编辑:
到目前为止,这是我的代码。似乎太短太粗暴了……我一定是在概念上遗漏了一些东西。
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)
}
【问题讨论】:
-
大致正确。该方法将值和优先级键作为参数。它将根据优先级键找到内部数据结构中保存对的位置以放置它。现在考虑如何设置该数据结构。您需要一个易于在中间添加、易于从中删除且易于进入开头的数据结构。如果您能找到将配对放在哪里开始(它会自行排序),则不必对任何内容进行排序。
-
编写一些代码并发布它以获得更多有用的反馈。这里和在线也有大量资源,其中包含实施细节。
-
谢谢@Al.Sal,我会尽快发布一些代码。我对我现在需要做什么有了更好的了解。
-
@kuast,我看到了这个问题。我的不同,因为如果有人对在哪里看有一些建议,它会迅速具体化。该问题还包括诸如更新周围节点等我没有的问题。在尝试从 OP 的角度看待问题之前,不要这么快对问题做出负面判断。
标签: algorithm swift priority-queue