我仔细阅读了这些文档,但是我仍然不清楚如何使用G.forEdges(),它被描述为“实验性的边缘迭代器接口”。在
假设我想降低图的密度。我有一个排序的权重列表,我想根据它们的权重移除边,直到图拆分成两个连接的组件。然后我将选择保持图形连接的最小链接数。我会这样做:
cc = components.ConnectedComponents(G).run()
while cc.numberOfComponents()==1:
for weight in weightlist:
for (u,v) in G.edges():
if G.weight(u,v)==weight:
G=G.removeEdge(u,v)
顺便说一下,我从docs中知道有一个边缘迭代器,它可能以更有效的方式进行迭代。但是从文档中我真的不明白如何正确地使用这个forEdges
,而且我在互联网上也找不到一个例子。有什么想法吗?在
或者是一个替代的想法来做我想做的事情:因为它是一个巨大的图(1.25亿个链接),所以即使我在一个集群上工作,迭代也要花很长时间。在
NetworKit迭代器接受一个回调函数,因此如果你想在边(或节点)上迭代,你必须定义一个函数,然后将它作为参数传递给迭代器。您可以找到更多信息here。例如,一个只打印所有边的简单函数是:
现在,如果您想继续删除权重在权重列表中的边,直到图形拆分为两个连接的组件,您还必须更新图形的连接组件,因为ConnectedComponents不会自动为您执行此操作(这可能也是迭代需要永远进行的原因之一)。为了有效地做到这一点,可以使用DynConnectedComponents类(参见下面的示例)。在本例中,我认为边缘迭代器对您没有太大帮助,所以我建议您继续使用for循环。在
^{pr2}$这应该会加快一点你的原始代码。但是,它仍然是顺序代码,所以即使你在多核机器上运行它,它也只会使用一个核心。在
相关问题 更多 >
编程相关推荐