迭代DFS实施有缺陷

时间:2019-02-25 09:49:27

标签: python python-3.x algorithm depth-first-search

我一直在练习算法和数据结构。而且我正在尝试编写DFS的迭代版本。

这是我的代码:

submit

但是它不起作用,因为在循环底部更改def dfsvisit_iterative(self,startVertex): stack = [] stack.append(startVertex) startVertex.setColor('gray') self.time += 1 startVertex.setDiscovery(self.time) while stack: tos = stack[-1] for nextVertex in tos.getConnections(): if nextVertex.getColor() == 'white': nextVertex.setColor('gray') nextVertex.setPred(tos) self.time += 1 nextVertex.setDiscovery(self.time) stack.append(nextVertex) tos = stack[-1] tos.setColor('black') self.time += 1 tos.setFinish(self.time) stack.pop() 时,我无法即时更新循环nextVertex in tos.getConnections():

您将如何解决?我知道我可以通过递归来做到这一点,但是我想要一个与我的版本接近的迭代解决方案。

1 个答案:

答案 0 :(得分:0)

我认为您并不是要在for循环中更改tos。在DFS中,您可以按任意顺序将所有相邻节点推送到堆栈上,推送完成后,您将获取最新的节点,即堆栈的顶部,并继续这样做。

因此,您根本不需要在for循环中使用此行tos = stack[-1]!另外,将最近添加的节点添加到您的for循环中后,这不是您想要的。因此,您需要在for循环之前将stack.pop()行移动。这也是有道理的,因为在DFS中,您从堆栈中弹出(删除)一个堆栈,将其推入相邻堆栈,然后重复执行。因此,您可以这样做:

    while stack:
        tos = stack[-1]
        stack.pop()

        for nextVertex in tos.getConnections():
            if nextVertex.getColor() == 'white':
                nextVertex.setColor('gray')
                nextVertex.setPred(tos)
                self.time += 1
                nextVertex.setDiscovery(self.time)
                stack.append(nextVertex)

        tos.setColor('black')
        self.time += 1
        tos.setFinish(self.time)

您想问的是什么:

如果出于任何原因(可能正在尝试?),您需要执行问题中已描述的操作,则可以尝试使用临时tos进行迭代。像这样:

while stack:
        tos = stack[-1]
        temp_tos = tos

        for nextVertex in temp_tos.getConnections():
            if nextVertex.getColor() == 'white':
                nextVertex.setColor('gray')
                nextVertex.setPred(tos)
                self.time += 1
                nextVertex.setDiscovery(self.time)
                stack.append(nextVertex)
                tos = stack[-1]

请注意,我在for循环之前仅添加了一行,并稍微更改了for循环的头部。其余的取决于您。