从BFS获得DFS?

时间:2015-03-11 17:10:54

标签: algorithm search data-structures graph-algorithm

是否可以让DFS进行BFS搜索?如果我只是使用一个堆栈,然后弹出它们不会以DFS顺序出现?

我正在尝试进行DFS搜索,但我只有一个带有传出边缘的邻接列表,因此我不知道如何获得每个顶点的不确定性。

0:2,4 1:没有 2:1,3 3:没有 4:无

因此0的输出边缘为2和4.

我有点迷失,并且想到如果我使用堆栈进行BFS搜索,我会得到DFS然后是拓扑订单。

2 个答案:

答案 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并使用它。它将以更简单,优雅和有效的方式实现。