【问题标题】:How to check if DirectedSparsedGraph contains an Edge between Nodes having those 2 nodes?如何检查 DirectedSparsedGraph 是否包含具有这两个节点的节点之间的边?
【发布时间】:2023-03-19 09:17:01
【问题描述】:

我正在尝试使用 jung 库创建 kNN 图。我已经到了需要检查图表中是否已经存在 2 个Nodes 之间的链接的时刻。

到目前为止我的代码:

for (int i = 0; i < k; i++) {
  for (Iterator<Node> it1 = mGraph.getVertices().iterator(); it1.hasNext();) {
    Node n1 = (Node) it1.next();
    double minDistance = 9999999;
    Node toConnect = null;

    for (Iterator<Node> it2 = mGraph.getVertices().iterator(); it2.hasNext();) {
      Node n2 = (Node) it2.next();
      double currDistance = this.getDistance(n1, n2);
      if( currDistance < minDistance &&  
          mGraph.containsEdge( /* WHAT HERE */ ) ){
        minDistance = currDistance;
        toConnect = n2; 
      }   
    }   
    mGraph.addEdge(new Link(), n1, toConnect, EdgeType.DIRECTED);   
  }           
}

我不知道该怎么做,因为Link 只有一个没有任何参数的构造函数。

【问题讨论】:

    标签: java graph distance jung knn


    【解决方案1】:

    isNeighbor() 适用于无向图,或者如果您不关心两个节点是如何连接的(即,现有边(如果有的话)的走向)。对于有向图,您可能需要 isPredecessor()。

    【讨论】:

    • 我最后使用了isPredecessor()。感谢您指出 isNeigbor() 仅用于无向。
    【解决方案2】:

    我发现我可以通过以下方式做到这一点(如果它有效且可以,也许有人会评论)

    mGraph.isNeighbor(n1, n2)
    

    【讨论】:

      【解决方案3】:

      例如,如果您有两个节点,n1 和 n2,并且您的图称为 mGraph,您可以简单地创建一个新方法:

      public boolean existsLink(Node n1, Node n2) {
        return mGraph.getNeighbors(n1).contains(n2);
      }
      

      如果返回true,则表示边存在;如果边缘不存在,则返回 false。请注意,mGraph.getNeighbors(n1) 是一个集合。

      你也可以使用方法:mGraph.containsEdge(E edge)。但我不知道你的 E 边缘是哪种类型,以及它有哪些方法。

      【讨论】:

      • 检查是否存在特定边缘仅在边缘对象的创建方式以某种方式合并节点时才有用(在 JUNG 中通常不需要,也不是这里发生的情况),这样您就可以创建边缘对象,然后询问它是否存在。 Graph.isPredecessor() 就是为此而生的。
      • 是的,我知道,但是根据他提供的信息,这是我能看到的唯一解决方案。如果他告诉我们哪种物体是他的边缘,我会建议那个选项....
      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2021-06-20
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多