簡體   English   中英

如何使用networkx刪除有向圖中的所有相關節點?

[英]How to delete all related nodes in a directed graph using networkx?

我不確定我的問題的正確術語是什么,所以我只是解釋我想做什么。 我有一個有向圖,在我刪除一個節點后,我想要刪除所有獨立相關的節點。

這是一個例子:

在此輸入圖像描述

比如說,我刪除節點'11',我也希望刪除節點'2'(在我自己的例子中,它們將是2以下的節點,現在也必須被刪除)因為它沒有連接到主圖了。 注意,不應刪除節點“9”或“10”,因為節點“8”和“3”仍然連接到它們。

我正在使用python庫networkx。 我搜索了文檔,但我不確定術語,所以我不確定這是什么。 如果可能的話,我想使用庫提供的函數,而不是通過圖形創建我自己的遞歸(因為我的圖非常大)。

任何有關如何做到這一點的幫助或建議都會很棒。

謝謝!

我假設以下是真的:

  • 該圖是非循環的 你在評論中提到了這一點,但我想明確指出這是一個開始的假設。
  • 有一組已知的根節點 我們需要有一些方法來了解哪些節點總是被認為是可達的,我認為(不知何故)這些信息是已知的。
  • 初始圖形不包含任何多余的節點 也就是說,如果初始圖包含應刪除的任何節點,則它們已被刪除。 這允許算法通過維持每個節點應該存在的不變量來工作。

如果是這種情況,那么給定初始設置,節點在圖中的唯一原因是

  1. 節點位於根可達的節點集中,或
  2. 該節點的父節點位於根可達節點集中。

因此,每次從圖中刪除節點時,可能需要刪除的唯一節點就是該節點的后代。 如果您刪除的節點位於根集中,則可能需要修剪大量圖形,如果刪除的節點是后代節點,其后代很少,那么您可能需要做很少的事情。

在給定此設置的情況下,一旦刪除了某個節點,您將需要掃描該節點的所有子節點,以查看它們中是否有其他父節點將其保留在圖形中。 由於我們假設圖中的唯一節點是需要存在的節點,如果已刪除節點的子節點至少有一個其他父節點,則它應該仍然在圖中。 否則,需要刪除該節點。 因此,執行刪除步驟的一種方法是以下遞歸算法:

  • 對於要刪除的節點的每個子節點:
    • 如果該節點只有一個父節點:(它必須是我們要刪除的節點)
      • 從圖中遞歸刪除該節點。
  • 從圖中刪除指定的節點。

但是,這可能不是直接實現的好算法,因為如果你有一個大圖,所涉及的遞歸可能會變得非常深。 因此,您可能希望使用像這樣的工作列表算法來實現它:

  • 創建工作清單W.
  • 將要刪除的節點v添加到W.
  • W不為空時:
    • 從W中刪除第一個條目; 叫它w。
    • 對於每個孩子:
      • 如果該孩子只有一個父母,請將其添加到W。
    • 從圖表中刪除w。

這最終是最壞情況下的O(m)時間,其中m是圖中邊緣的數量,因為理論上每個邊緣都必須被掃描。 但是,假設您的圖表中有一些冗余,它可能會快得多。

希望這可以幫助!

讓我為您提供解決任務的python networkX代碼:

import networkx as nx
import matplotlib.pyplot as plt#for the purpose of drawing the graphs
DG=nx.DiGraph()
DG.add_edges_from([(3,8),(3,10),(5,11),(7,11),(7,8),(11,2),(11,9),(11,10),(8,9)])
DG.remove_node(11)

connected_components方法令人驚訝地無法在有向圖上工作,因此我們將圖形轉向無向,找出未連接的節點,然后從有向圖中刪除它們

UG=DG.to_undirected()
not_connected_nodes=[]
for component in nx.connected_components(UG):
    if len(component)==1:#if it's not connected, there's only one node inside
        not_connected_nodes.append(component[0])
for node in not_connected_nodes:
    DG.remove_node(node)#delete non-connected nodes

如果要查看結果,請在腳本中添加以下兩行:

nx.draw(DG)
plt.show() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM