如何使用networkx删除有向图中的所有相关节点?
我不确定我的问题的正确术语是什么,所以我只会解释我想做的事情。我有一个有向图,删除节点后我希望所有独立相关的节点也被删除。
这是一个示例:
比如说,我删除节点“11”,我希望删除节点“2”同样(在我自己的示例中,它们将是 2 以下的节点,现在也必须删除),因为它不再连接到主图。请注意,不应删除节点“9”或“10”,因为节点“8”和“3”仍然连接到它们。
我正在使用 python 库 networkx。我搜索了文档,但我不确定术语,所以我不确定这叫什么。如果可能的话,我想使用库提供的函数,而不是通过图形创建我自己的递归(因为我的图形很大)。
任何有关如何执行此操作的帮助或建议都会很棒。
谢谢!
I'm not sure exactly sure what the correct terminology is for my question so I'll just explain what I want to do. I have a directed graph and after I delete a node I want all independently related nodes to be removed as well.
Here's an example:
Say, I delete node '11', I want node '2' to be deleted as well(and in my own example, they'll be nodes under 2 that will now have to be deleted as well) because its not connected to the main graph anymore. Note, that node '9' or '10' should not be deleted because node '8' and '3' connect to them still.
I'm using the python library networkx. I searched the documentation but I'm not sure of the terminology so I'm not sure what this is called. If possible, I would want to use a function provided by the library than create my own recursion through the graph(as my graph is quite large).
Any help or suggestions on how to do this would be great.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我假设以下条件成立:
如果是这种情况,则给定初始设置,节点位于图中的唯一原因是
因此,每当您从图中删除节点时,可能需要删除的唯一节点就是该节点的后代。如果您删除的节点位于根集中,则可能需要修剪大量图形,并且如果您删除的节点是其后代节点很少的后代节点,则您可能需要做的事情很少。
鉴于此设置,一旦删除节点,您将需要扫描该节点的所有子节点,以查看其中是否有任何节点没有其他父节点将它们保留在图中。由于我们假设图中唯一的节点是需要存在的节点,因此如果已删除节点的子节点至少有一个其他父节点,那么它仍然应该在图中。否则,需要删除该节点。因此,执行删除步骤的一种方法是以下递归算法:
不过,这可能不是一个直接实现的好算法,因为如果您有一个大图,所涉及的递归可能会变得相当深。因此,您可能希望使用如下工作列表算法来实现它:
这最终是最坏情况的 O(m) 时间,其中 m 是图中的边数,因为理论上每条边都必须被扫描。但是,假设您的图表中有一些冗余,它可能会快得多。
希望这有帮助!
I am assuming that the following are true:
If this is the case, then given an initial setup, the only reason that a node is in the graph would be either
Consequently, any time you delete a node from the graph, the only nodes that might need to be deleted are that node's descendants. If the node that you remove is in the root set, you may need to prune a lot of the graph, and if the node that you remove is a descendant node with few of its own descendants, then you might need to do very little.
Given this setup, once a node is deleted, you would need to scan all of that node's children to see if any of them have no other parents that would keep them in the graph. Since we assume that the only nodes in the graph are nodes that need to be there, if the child of a deleted node has at least one other parent, then it should still be in the graph. Otherwise, that node needs to be removed. One way to do the deletion step, therefore, would be the following recursive algorithm:
This is probably not a good algorithm to implement directly, though, since the recursion involved might get pretty deep if you have a large graph. Thus you might want to implement it using a worklist algorithm like this one:
This ends up being worst-case O(m) time, where m is the number of edges in the graph, since in theory every edge would have to be scanned. However, it could be much faster, assuming that your graph has some redundancies in it.
Hope this helps!
让我为您提供解决您的任务的 python networkX 代码:
connected_components 方法令人惊讶地不适用于有向图,因此我们将图转换为无向,找出未连接的节点,然后从有向图中删除它们
如果您愿意要查看结果,请将以下两行添加到脚本中:
Let me provide you with the python networkX code that solves your task:
connected_components method surprisingly doesn't work on the directed graphs, so we turn the graph to undirected, find out not connected nodes and then delete them from the directed graph
If you want to see the result, add to the script the following two lines: