【问题标题】:Optimizing DFS in python在 python 中优化 DFS
【发布时间】:2017-09-05 07:46:23
【问题描述】:

我正在学习算法并且正在做这个problem,它正在寻找区域的数量。我尝试了使用 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)

失败的输入是一个全 1 的 100x100 矩阵

错误是get是:

RuntimeError: maximum recursion depth exceeded

谢谢!

【问题讨论】:

  • 这不是 DFS... 提示:您的 DFS 函数不会返回任何内容。
  • 我正在更改矩阵。它适用于较小的输入。你能告诉我我要去哪里吗?
  • 更改矩阵如何帮助您找到连通分量的数量?
  • 如果单元格为 1,我将其设为 0,然后对其邻居进行 DFS。更改它可确保不再遇到相同的单元格。希望这是有道理的。
  • 对不起,我应该说独立组件而不是连接组件。它找到矩阵中的区域数。在第一次 dfs 调用完全完成后,所有直接连接的 1 都将变为 0,这使得这一个组件在我增加计数时。这个链接有完整的问题陈述leetcode.com/problems/friend-circles

标签: python algorithm depth-first-search


【解决方案1】:

为什么不做一个标准的 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 还是错误的实现?
  • @SalmaanP 图表示称为adjacency matrix。您所做的看起来更像是将边视为顶点。
  • 谢谢,我明白我在哪里困惑了。我的方法是否适用于此处显示的普通矩阵 youtube.com/watch?v=R4Nh-EgWjyQ
  • @SalmaanP 快速浏览一下,它似乎已经解决了视频中描述的问题。但请注意,LeetCode 问题是完全不同的类型,尽管它们都有二进制矩阵作为输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2013-05-28
  • 2021-07-12
  • 2017-04-06
相关资源
最近更新 更多