2016-03-21 8 views
0

Bağlı bir bileşenin tüm öğelerini etiketlemek istiyorum. Grafiğin bağlantıları sözlükler sözlüğü ile biçimlendirilmiştir. Yinelemeli algoritma hızlı, büyük grafikler için unfortunatelly gibi görünüyor, maksimum yineleme derinliği sorunlara yol açıyor ve her seferinde maksimum yineleme uzunluğunu artırmak istemiyorum. Bu kodu nasıl yazacağını biliyor musun, böylece derinlik artık sorun değil mi? iteratif sürüme bir özyinelemeli işlevindenBağlı bileşen analizinde maksimum yineleme derinliğinden kaçının mı?

import numpy as np 
def find_components(dists): 

    N = len(dists.keys()) 
    labels = np.zeros(N, dtype = np.int) - 1 
    n = 0 
    steps = 0 

    def walk(j): 
     for k in dists[j].keys(): 
      if (labels[k] == -1): 
       labels[k] = labels[j] 
       walk(k) 

    remains = (labels == -1) 
    while n < N: 
     i = np.arange(0,N,1)[remains][np.random.randint(0,N - n)] 
     labels[i] = i 
     walk(i) 
     remains = (labels == -1) 
     n = N - len(np.nonzero(remains)[0]) 
    unique = np.unique(labels) 
    labels_ = np.zeros(N, dtype = np.int) - 1 
    for i, label in enumerate(unique): 
     labels_[labels == label] = i 
    return labels_ 
+2

belirli veri girişi çok derin gidebilir burada bir DFS (derinlik ilk arama), kullandığınız görünüyor. Sanırım bir BFS (ilk genişlikte arama) tarzında yeniden yazabilirsiniz. – starrify

cevap

1

dönüştürme walk():

import collections 

def walk(j): 
    lifo = collections.deque(j) 

    while lifo: 
     for k in dists[lifo.pop()].keys(): 
      if labels[k] == -1: 
       labels[k] = labels[j] 
       lifo.append(k) 
+0

Ayrıca, BFS'dir. Teşekkür ederim! – varantir

İlgili konular