在python中优化DFS

在python中优化DFS,python,algorithm,depth-first-search,Python,Algorithm,Depth First Search,我在学习算法,并且在做这个,就是寻找区域的数量。我尝试了一种使用python的深度优先搜索方法,但我得到了一个调用堆栈超出错误。谁能告诉我我的实现中有什么缺陷以及如何克服它?代码是: def findCircleNum(A): count = 0 def dfs(row, column): if row < 0 or column >= len(A[0]) or row >= len(A) or column < 0:

我在学习算法,并且在做这个,就是寻找区域的数量。我尝试了一种使用python的深度优先搜索方法,但我得到了一个调用堆栈超出错误。谁能告诉我我的实现中有什么缺陷以及如何克服它?代码是:

def findCircleNum(A):

    count = 0

    def dfs(row, column):
        if row < 0 or column >= len(A[0]) or row >= len(A) or column < 0:
            return

        if A[row][column] == 0:
            return

        A[row][column] = 0

        for i in range(row-1, row+2):
            if i >= 0 and i<len(A) and A[i][column] == 1:
                dfs(i, column)
        for i in range(column-1, column+2):
            if i >= 0 and i<len(A[0]) and A[row][i] == 1:
                dfs(row, i)




    for row in range(len(A)):
        for column in range(len(A[0])):
            if A[row][column] == 1:
                dfs(row, column)
                count += 1


    return count


findCircleNum(m)

谢谢

为什么不在使用集合跟踪访问的顶点(学生)时执行标准DFS?问题陈述说矩阵的最大大小是200x200,所以假设它是1000,就不必担心递归限制。使用集合进行跟踪也会使代码更简单:

def findCircleNum(A):
    count = 0
    visited = set()

    def dfs(student):
        if student in visited:
            return

        visited.add(student)
        for i, friend in enumerate(A[student]):
            if friend:
                dfs(i)

    for student in range(len(A)):
        # Note we want to track circles, student without any friend won't count
        if student not in visited and any(A[student]):
            dfs(student)
            count += 1

    return count

编辑有问题的代码似乎在执行DFS时将边视为顶点。这也可以解释递归深度的问题,因为100个顶点的无向图具有循环,但没有多条边具有最大(100*101)/2=5050条边。

这不是DFS。。。提示:DFS函数不会返回任何内容。我正在修改矩阵。它适用于较小的输入。您能告诉我我在哪里停止吗?更改矩阵如何帮助您找到连接组件的数量?如果单元格为1,我将其设置为0,然后对其邻居执行DFS。更改它可以确保不再遇到相同的单元格。希望这有意义。对不起,我应该说独立组件而不是连接组件。它是在矩阵中查找区域的数量。在第一个dfs调用完全完成后,所有直接连接的1都将变为0,这使这一组件在点i递增计数。这个链接有完整的问题陈述好的,我现在明白了。我手动查看每个单元格,并对其相邻单元格执行DFS,因为它的工作方式类似于邻接列表,所以我们可以获取整行。只是好奇,我所做的是正确的DFS还是错误的实现?@SalmaanP图形表示法被称为。您所做的看起来更像是将边视为顶点。谢谢,我明白我的困惑所在。我的方法能在这里所示的正常矩阵上工作吗?@SalmaanP快速浏览一下,它似乎能解决视频中描述的问题。但请注意,LeetCode问题是完全不同的类型,尽管它们都有二进制矩阵作为输入。
def findCircleNum(A):
    count = 0
    visited = set()

    def dfs(student):
        if student in visited:
            return

        visited.add(student)
        for i, friend in enumerate(A[student]):
            if friend:
                dfs(i)

    for student in range(len(A)):
        # Note we want to track circles, student without any friend won't count
        if student not in visited and any(A[student]):
            dfs(student)
            count += 1

    return count