Ich arbeite an dem gleichen Problem des Zählens der Anzahl der Dreiecke auf ungerichtet Graph und Wisty's Lösung funktioniert wirklich gut in meinem Fall. Ich habe es ein wenig modifiziert, so dass nur ungerichtete Dreiecke gezählt werden.
#### function for counting undirected cycles
def generate_triangles(nodes):
visited_ids = set() # mark visited node
for node_a_id in nodes:
temp_visited = set() # to get undirected triangles
for node_b_id in nodes[node_a_id]:
if node_b_id == node_a_id:
raise ValueError # to prevent self-loops, if your graph allows self-loops then you don't need this condition
if node_b_id in visited_ids:
continue
for node_c_id in nodes[node_b_id]:
if node_c_id in visited_ids:
continue
if node_c_id in temp_visited:
continue
if node_a_id in nodes[node_c_id]:
yield(node_a_id, node_b_id, node_c_id)
else:
continue
temp_visited.add(node_b_id)
visited_ids.add(node_a_id)
Natürlich müssen Sie zum Beispiel ein Wörterbuch verwenden
#### Test cycles ####
nodes = {}
nodes[0] = [1, 2, 3]
nodes[1] = [0, 2]
nodes[2] = [0, 1, 3]
nodes[3] = [1]
cycles = list(generate_triangles(nodes))
print cycles
den Code Wisty Verwendung fanden die Dreiecke [(0, 1, 2) sein, (0, 2 , 1), (0, 3, 1), (1, 2, 3)]
, die das Dreieck (0, 1, 2) und (0, 2, 1) als zwei verschiedene Dreiecke zählte. Mit dem Code, den ich modifiziert habe, werden diese als nur ein Dreieck gezählt.
Ich benutzte dies mit einem relativ kleinen Wörterbuch von weniger als 100 Tasten und jede Taste hat durchschnittlich 50 Werte.
bereitgestellt Welche Algorithmen haben Sie in Betracht gezogen? Was hast du probiert? –