Python 避免连接组件分析中的最大递归深度?

Python 避免连接组件分析中的最大递归深度?,python,recursion,Python,Recursion,我想标记连接组件的所有元素。图表的链接使用字典字典进行格式化。带递归的算法似乎很快,不幸的是,对于较大的图,最大递归深度会产生问题,我不想每次都增加最大递归长度。你知道如何重写这段代码,这样深度就不会再麻烦了吗 import numpy as np def find_components(dists): N = len(dists.keys()) labels = np.zeros(N, dtype = np.int) - 1 n = 0 steps = 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_
将numpy导入为np
def查找组件(dist):
N=len(dists.keys())
labels=np.zero(N,dtype=np.int)-1
n=0
步数=0
def步行(j):
对于距离[j]中的k,键():
如果(标签[k]=-1):
标签[k]=标签[j]
步行(k)
剩余=(标签==-1)
当n
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)
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)

看起来您在这里使用的是DFS(深度优先搜索),它可能会深入到特定的输入数据。我想你可以用BFS(广度优先搜索)的方式重写它。看起来你在这里使用的是DFS(深度优先搜索),它可能会深入到特定的输入数据。我想你可以用BFS(广度优先搜索)的方式重写它。这也是BFS。非常感谢。这也是BFS。非常感谢。