簡體   English   中英

計算圖中的所有連接節點

[英]Counting all connected nodes in graph

我有一個> 10k的(無序)數字對列表。 我想將它們直接或間接地分類為連接對的集合。 我認為這對應於無向圖。 我使用python,並試圖像這樣來表示這種結構。

為了知道與i所有數字,我可以檢查列表中除i之外的所有j是否有從ij的路徑。 但是,使用此實現,對於我正在處理的列表大小而言,計算時間變得太長。 有沒有更有效的方法可以做到這一點? (或者是否已經建立了python庫?)

聽起來好像您對計算圖形的連接組件感興趣。 我建議研究一下networkx軟件包及其用於計算組件的工具

例如,假設我們的數據是數字對的列表,每對數字代表圖形中的一條邊:

pairs = [
    (1, 2),
    (2, 4),
    (3, 5),
    (2, 5),
    (7, 9),
    (9, 10),
    (8, 7)
]

在這些邊緣表示的圖中,集合{1, 2, 3, 4, 5}任何一對節點之間都有一條路徑, {6, 7, 8, 9, 10}任何一對節點之間也都有一條路徑{6, 7, 8, 9, 10} 但是,例如從57 ,是沒有路徑的。 也就是說,圖中有兩個連接的組件。

為了發現這些組件,我們首先導入networkx並創建一個圖形:

>>> import networkx as nx
>>> graph = nx.from_edgelist(pairs)

計算組件非常簡單

>>> list(nx.connected_components(graph))
>>> [{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}]

nx.connected_components是一個生成器,因此在這里我們將結果轉換為一個列表,以顯示所有連接的組件。

我們還可以找到包含給定節點的連接組件:

>>> nx.node_connected_component(graph, 3)
{1, 2, 3, 4, 5}

我們還可以快速計算已連接組件的數量:

>>> nx.number_connected_components(graph)
2

暫無
暫無

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

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