繁体   English   中英

Java图形连通性算法的通用实现

[英]Implementation of a generic for graph connectivity algorithms in Java

我有一个对象工厂的接口,该接口从给定顶点创建Function<Object,Vertex>和链接BiPredicate<Vertex,Vertex>的对象集合中创建图形。

通过提供这两种功能,此设计可以指定任意的图形连接算法,但是就我已经能够实现的功能而言,这样做的代价是必须循环遍历输入集合中的所有对象对,例如这(在其他地方定义了GraphVertex类):

Function<Object,Vertex> maker; // defined by user.
BiPredicate<Vertex,Vertex> linker; // defined by user.

Graph makeGraph( Collection<Object> input ) {
    Graph g = new Graph();
    Collection<Vertex> vertices = input.stream.map( ( Objec t ) -> maker.apply( t ) ).collect( Collectors.toList() );
    for( Vertex ego : vertices ) {
        Collection<Vertex> alters = new ArrayList<>();
        alters.addAll( vertices );
        alters.remove( ego );
        for( Vertex alter : alters ) {
            if( linker.test( ego, alter ) ) {
                g.makeEdge( ego, alter );
            }
        }
    }
}

我实际上有两个问题:

  1. 有比我创建新列表,复制所有内容并从副本中删除i的丑陋解决方案更好的迭代集合中所有可能对(i,j)的优雅方法吗?

  2. 有谁能想到优化这种双重迭代的方法? 现在,在最佳情况下,此操作的执行时间为O(n ^ 2),因为实现需要在不了解链接功能的情况下接受链接功能,但是也许有解决方法? 例如,指定某些参数以指示例如,共生网络的链接器测试第一次失败后迭代可能会中断,等等。

当然,如果任何人都可以想到解决此问题的另一种方法,我将很高兴听到它。

编辑:

忘记第一个问题,Robert Navado的回答使我意识到我错了。

为了澄清一下:我正在寻找一种告诉实现方式的方法,即可以在特定条件下优化链接器功能的应用(例如,在上述同时出现的示例中,“按位置排序并在第一个否定结果后中断” “)。

好吧,直到在图形中的图形中可以具有未链接的顶点并且图形稀疏之前,我建议存储边缘而不是存储顶点。 但是,单链接团的最大边数为V *(V-1)。 因此,在更坏的情况下,您将需要O(V ^ 2)迭代来链接您的图形,对于多图则甚至需要更多。

至于迭代语法,以下内容也应该起作用:

for(Vertex alter : vertices )
   for(Vertex ego : vertices ){
       //Do the descision
}

看一下JUNG库中的图操作。 它可能已经过时了,但是您可以看看它们的数据结构以获取启发。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM