[英]Finding cycles in a dictionary of lists
我有一個 python id 字典。 每個 id 都有一組它引用的其他 id。 如何在字典中找到循環引用?
我的字典的一個例子是:
{1: [3], 2: [1], 3: [2, 4], 4: [2, 3]}.
每個 id 鍵的值是它引用的其他 id 的列表,它們不能引用自己。
因此,如果存在循環引用,output 將是:
{3, 4 , 3}.
我正在努力弄清楚如何 go 解決這個問題,因為這似乎是一個常見問題。 非常感謝您提供幫助的任何人。
networkx
庫可以在您的圖中找到循環。 您將需要實例化一個有向圖,因為 ID 之間的鏈接是單向的。 您的圖表中有多個循環。 例如,3 到 4,4 到 3。這也被認為是一個循環。
import networkx as nx
data = {1: [3], 2: [1], 3: [2, 4], 4: [2, 3]}
graph = nx.DiGraph(data)
list(nx.simple_cycles(graph))
# returns:
[[1, 3, 4, 2], [1, 3, 2], [3, 4]]
如果您正在尋找長度僅為 2 的循環引用,即僅針對 (i,j) 對,這樣 i 引用 j 並且 j 引用 i,那么下面的代碼有效:
d = {1: [3], 2: [1], 3: [2, 4], 4: [2, 3]}
for i in d:
for j in d[i]:
if i in d[j]:
print("Cycle found: ", i, j)
Output:
Cycle found: 3 4
Cycle found: 4 3
上面的程序做了以下工作:對於字典中的每個鍵 i,如果 i 引用了 j,那么檢查 j 是否也引用了 i(即 i 是否也在 d[j] 中),如果是,則打印 i 和 j。 您可以擴充程序以僅在 i < j 時存儲(或打印)(i,j),以免每個循環打印兩次。
如果你還想打印更大長度的循環引用(比如當 i 引用 j,j 引用 k,k 引用 i),那么你可以構造一個邊集為 {(i,j): i references j} 的有向圖,並運行一種算法(例如約翰遜算法)來查找有向圖中的所有基本循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.