是否可以让DFS进行BFS搜索?如果我只是使用一个堆栈,然后弹出它们不会以DFS顺序出现?
我正在尝试进行DFS搜索,但我只有一个带有传出边缘的邻接列表,因此我不知道如何获得每个顶点的不确定性。
0:2,4 1:没有 2:1,3 3:没有 4:无
因此0的输出边缘为2和4.
我有点迷失,并且想到如果我使用堆栈进行BFS搜索,我会得到DFS然后是拓扑订单。
答案 0 :(得分:2)
迭代完成后,DFS和BFS之间的唯一区别是用于存储将在未来迭代中处理的顶点的数据结构。
使用队列并获得BFS,使用堆栈并获得DFS。
def bfs(g, start):
discovered = [False] * (len(g) + 1)
processed = [False] * (len(g) + 1)
parents = [-1] * (len(g) + 1)
discovered[start] = True
q = deque() #Different line
q.append(start)
while len(q) > 0:
v = q.popleft() #Different line
print "Visited:" + str(v)
# process_ve(v)
nbors = g[v]
for n in nbors:
if not p[n]:
# process_edge((v,n))
print ((v, n))
if not discovered[n]:
discovered[n] = True
parents[n] = v
q.append(n)
# process_vl(v)
processed[v] = True
return parents
和DFS:
def dfs(g, start):
discovered = [False] * (len(g) + 1)
processed = [False] * (len(g) + 1)
parents = [-1] * (len(g) + 1)
discovered[start] = True
q = list() #Different line
q.append(start)
while len(q) > 0:
v = q.pop() #Different line
print "Visited:" + str(v)
# process_ve(v)
nbors = g[v]
for n in nbors:
if not processed[n]:
# process_edge((v,n))
print ((v, n))
if not discovered[n]:
d[n] = True
pts[n] = v
q.append(n)
# process_vl(v)
processed[v] = True
return parents
上面Python中的示例应该清楚明白。它们之间的唯一区别是我们在一个中使用deque
(Python的队列版本),在另一个中使用list
(Python的版本的堆栈)。
示例遵循Steve Skiena在The Algorithm Design Manual中解释的算法。
答案 1 :(得分:-1)
如果您采用经典的BFS算法并将FIFO队列替换为LIFO堆栈,您确实会获得DFS 顶点发现顺序 - 所谓的DFS 预订。即您的算法首次访问的图形顶点的顺序与DFS完全相同。
但是,这不会为您提供DFS内存使用,也不会为您提供后置顶点 - 经典DFS算法的其他极为重要的属性(Why is depth-first search claimed to be space efficient?)
换句话说,声称用堆栈替换BFS队列将BFS变为DFS是完全错误的。这些算法的规范形式具有完全不同的内部结构。您将通过此类替换获得的是伪DFS 算法,该算法将成功模拟 DFS预订,但不会为您提供DFS后期订购。
所以这是一个关于你想要用它的问题。你需要DFS后期订购吗?
看起来你确实这样做了。经典的toposort算法专门基于使用DFS生成的顶点后期排序。 toposort顺序是经典DFS算法使最后一次访问到每个顶点的顺序。这立即意味着您的伪DFS将无法用于此目的。
可能有某种方式可以将其提交到提交状态"并且通过在这里和那里添加一堆拐杖使其工作,但它根本不值得。只需使用经典的正版DFS并使用它。它将以更简单,优雅和有效的方式实现。