我一直在练习算法和数据结构。而且我正在尝试编写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():
。
您将如何解决?我知道我可以通过递归来做到这一点,但是我想要一个与我的版本接近的迭代解决方案。
答案 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循环的头部。其余的取决于您。