代码之家  ›  专栏  ›  技术社区  ›  Salmaan P

在python中优化DFS

  •  3
  • Salmaan P  · 技术社区  · 7 年前

    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)
    

    错误为get is:

    RuntimeError: maximum recursion depth exceeded
    

    1 回复  |  直到 7 年前
        1
  •  2
  •   niemmi    7 年前

    为什么不在使用集合跟踪访问的顶点(学生)的同时执行标准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条边。