(Dijkstra的)如何有效地找到另一个集合中具有最小值的HashMap密钥?

时间:2018-09-28 10:08:56

标签: java sorting graph-theory dijkstra

我正在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吗?

我该怎么办?谢谢。

1 个答案:

答案 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);
        }
    }
);