我正在this pseudocode from Wikipedia之后实施Dijkstra的算法,并且在加快算法速度方面有些坚持。我知道我也可以使用Priority Queue / Fib Heap来实现最佳化,但是我还不太了解这两个,所以我想先开始基本的实现。
其中之一是在dist
中找到具有最小值的顶点,该顶点也在集合Q
中(通过伪代码)。
(我用LinkedHashMap<String, LinkedHashMap<String, Double>>
表示了有向加权图,以通过其标签表示一个顶点,并使用权重将其连接的顶点列表作为其值。)
这就是我实现这些2的方式:
// Vertex:Distance HashMap, i.e. dist.
HashMap<String, Double> dist = new HashMap<>();
for (String v : this.adjacencyList.keySet()) {
dist.put(v, Double.POSITIVE_INFINITY);
}
dist.put(s, (double) 0);
Set<String> vertices = this.adjacencyList.keySet(); // This is Q.
while (!vertices.isEmpty()) {
!!! u ← vertex in Q with min dist[u] !!!
}
!!!
部分是我所坚持的。我可以想到一种蛮力的方法,即对dist
进行排序,然后找到同样位于vertices
中的最小密钥,但这似乎并不是一种明智的方法。我应该如何解决这个问题?
由于HashMap并不是固有排序的,因此我必须以某种方式对其进行排序才能获得最小值,对吗?最初它将是根顶点s
,因为其他所有东西都是无穷大,但是我不应该在每次迭代中都对其进行排序。我应该首先不要为HashMap<String, Double>
使用dist
吗?
我该怎么办?谢谢。
答案 0 :(得分:2)
为什么不将TreeSet或TreeMap与自定义比较器一起使用?使用TreeSet可以按最小距离对所有项目(包装在POJO中)进行排序。迭代时从集合中取出的第一件事具有最小的距离。
以下是此类集合的示例:
class Elements {
public Double distance;
public String vertex; // Whatever you want
}
TreeSet<Elements> queue = new TreeSet<Elements>(new Comparator<Elements>() {
@Override
public int compare(Elements a, Elements b) {
return a.distance.compareTo(b.distance);
}
}
);