我想找到jung implementation of directed graph中给定顶点的K个最远点。
我认为BFSDistanceLabeler完成了这项工作。但是,它没有为返回K个最远点提供api,所以我必须通过遍历图中的所有顶点并调用getDistance方法来手动完成。或者有更好的方法吗?
但对我来说还有更大的挑战。尽管图表是针对性的,但我想将其视为距离贴标机的无向性。是否有可能以某种方式快速从有向图切换到其无向版本?
为什么我需要将图表视为无向?
我在后续步骤中分析了一个非常大的网络(数百万个顶点)。在每个步骤中,将一小部分网络(数千个顶点)加载到图形中并进行分析。该分析需要有向图并提供一个特定顶点的结果,该顶点必须位于加载区域的中心。
当我从步骤A转到步骤B时,我可以删除整个上一个图表并创建一个新图表。然而,这将是非常耗时的。因为我知道我感兴趣的新顶点接近前一个顶点,所以图形的很大一部分可以重复使用。
这就是为什么我需要为新的主顶点移除K个最远的顶点,并用这个顶点周围的新顶点替换它们。
让我们看一下带图的底部图片,让我们说顶点1是我们感兴趣的顶点。由于图是指向的,顶点数6是最远的。但是,如果图形被视为无向图形,则顶点编号4将是最远的,这就是我需要的。
答案 0 :(得分:2)
找不到给定输入顶点的所有最远顶点的方法不会比找到所有顶点的距离更快捷。
您可以通过调用getVerticesInOrderVisited()
来更有效地获取最远的顶点,然后从“尾部”开始以相反的顺序遍历列表:此列表应按照距离增加的顺序填充根(设置),所以只需从列表中获取顶点,直到每个顶点的距离开始减小。
(注意:这不会拾取可能与根顶点完全断开的顶点,您可以认为它们是"最远的&#34 ;; getUnvisitedVertices()
会这样做。)< / p>
回答你的第二个问题*:基本上你想要做的是将有向边视为无向。 JUNG允许你这样做;例如,您可以拨打getSuccessors()
,而不是使用getPredecessors()
/ getNeighbors()
。
正如您所推断的那样,BFSDistanceLabeler
并没有这样做;如果它存在,它想要尊重边缘方向,因此它使用getSuccessors()
。
所以这里有一些选择:
使用jung.algorithms.transformation.DirectionTransformer.toUndirected()
。这很容易,但涉及创建一堆新的(无向)边
创建一个覆盖BFSDistanceLabeler
的{{1}}子类,并将labelDistances()
替换为getSuccessors()
。这很简单,如果不是很优雅的话。
创建一个getNeighbors()
子类,覆盖GraphDecorator
以在其委托图上调用getSuccessors()
。然后创建子类的实例,其中原始图是委托。
这是最优雅和通用的解决方案。 (在某些时候,为我们提供为您执行此操作的实用程序可能会有用;请随时在JUNG GitHub页面上提交问题:https://github.com/jrtom/jung/issues)
希望这有帮助。
*为了将来参考,请将不相关的问题分成单独的StackOverflow问题;它使他们更容易回答和找到。