注意。接続された2つのノードには、同じペアの親と子を持つことはできません。接続されたノードの場合、1つのノードには、親セット内に他のノードがあり、子セット内には別のノードがあります。
したがって、同じグループ内のノードには、同じ親ノードと子ノードのセットがあります。 Pythonには、親と子の組のペアによるdict索引付けを実装した単純なソリューションがあります。私はそれがいかに効率的かは分かりませんが、試してみる価値があります。
from collections import defaultdict
children = {
1: [2, 3, 4, 5, 6, 7, 8],
2: [3, 4, 5, 6, 7, 8, 9],
3: [9, 10],
4: [9, 10],
5: [9, 10],
6: [9, 10],
7: [9, 10],
8: [9, 10],
9: [10],
10: [11, 12, 13],
11: [14, 15],
12: [13, 14, 15],
13: [16, 17],
14: [16, 17],
15: [16, 17],
16: [18],
17: [18],
18: [19, 20],
19: [21, 22],
20: [21, 22],
21: [],
22: [],
}
# Collect parents
parents = defaultdict(list)
for a, bs in children.iteritems():
for b in bs:
parents[b].append(a)
# Use default dict to collect nodes that have same parents and children
store = defaultdict(list)
for node in children.iterkeys():
store[(tuple(sorted(children[node])), tuple(sorted(parents[node])))].append(node)
# Result
for s in store.itervalues():
if len(s) > 1:
print s
グループ{11,12}は結果ではありません。 11は13に接続されていません。
ありがとうございました。間違ったサンプル結果が修正されました。このコードがどれほどスケールアップしているかをチェックします。 – Parashar
@Parasharもしあなたがnetworkxを使っているのであれば、親と子のメソッドは先祖()と後継()です。あなたはタプルの代わりにfrozensetを試すことができます。おそらく、インデックス作成の方が速いでしょう。その変更タプル(sorted(nodes)) - > frozenset(nodes)の場合 – Ante
非常にうまく動作します。あなたの答えを解決策として受け入れました。 – Parashar