2016-03-21 19 views
0

接続コンポーネントのすべての要素にラベルを付ける必要があります。グラフのリンクは、辞書の辞書でフォーマットされています。再帰を伴うアルゴリズムは高速であり、大規模なグラフでは不幸にも最大再帰深度が問題になり、毎回最大再帰の長さを増やしたくありません。このコードを書き直して、深さがもはや問題にならないようにする方法を知っていますか?接続コンポーネント分析で最大再帰深度を回避するには?

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

を使用すると、特定の入力データに非常に深い行くかもしれない、ここではDFS(深さ優先探索)を使用しているようです。私はあなたがBFS(幅優先検索)の方法でそれを書き直すかもしれないと思います。 – starrify

答えて

1

反復バージョンに再帰関数から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

これはBFSです。ありがとうございました! – varantir

関連する問題