用Java实现边加权图的最佳方法

时间:2014-06-23 17:46:59

标签: java algorithm graph

首先,我处理超过1000条边的图形,并且我遍历邻接列表,以及每秒超过100次的顶点。因此,我真的需要一个符合我目标的高效实施。

我的顶点是整数,我的边是无向的,加权的。

我看过this代码 但是,它使用边缘对象对邻接列表进行建模。这意味着当我想要获得顶点的邻接时,我必须花费O(|adj|)时间,其中|adj|是其邻接的基数。

另一方面,我考虑使用Map<Integer, Double>[] adj对邻接列表进行建模。
通过使用这种方法,我只需使用adj[v]v作为顶点,并获取顶点的邻接来迭代。

另一种方法需要:

public Set<Integer> adj(int v) 
{
    Set<Integer> adjacents = new HashSet<>();
    for(Edge e: adj[v])
        adjacents.add(e.other(v));
    return adjacents;
}

我的目标是:

  • 我想在任何时候根据它们的连接性(邻接数量)对顶点子集进行排序。
  • 另外,我需要通过连接自身及其邻居的边的权重来对顶点的邻接进行排序。
  • 我想在不使用太多空间来减慢操作的情况下完成这些操作。我应该考虑使用邻接矩阵吗?

1 个答案:

答案 0 :(得分:1)

我已经将JGrapht用于图书馆,用于各种我自己的图表表示。他们在这里有一个加权图表实现:http://jgrapht.org/javadoc/org/jgrapht/graph/SimpleWeightedGraph.html

这似乎处理了很多你正在寻找的东西,并且我已经用它来表示最多约2000个顶点的图形,并且它可以很好地满足我的需求,尽管我不是记住我的访问率。