【问题标题】:Best Way to Implement an Edge Weighted Graph in Java在 Java 中实现边加权图的最佳方法
【发布时间】:2014-06-23 17:46:58
【问题描述】:

首先,我正在处理超过 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;
}

我的目标是:

  • 我想随时按顶点的连通性(相邻点的数量)对顶点子集进行排序。
  • 此外,我需要根据连接自身及其相邻节点的边的权重对顶点的相邻节点进行排序。
  • 我想在不使用会减慢操作的空间的情况下执行这些操作。我应该考虑使用邻接矩阵吗?

【问题讨论】:

    标签: java algorithm graph


    【解决方案1】:

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

    这似乎可以处理很多您正在寻找的东西,我已经用它来表示具有大约 2000 个顶点的图形,它可以很好地满足我的需求,尽管我不记得我的访问率.

    【讨论】:

    • 有没有办法在 JGraphT 中定义自定义边?
    • 加权图的构造函数将边类或边工厂作为参数。我不明白为什么你不能让你的自定义类扩展它们以将它们用作参数
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多