相关疑难解决方法(0)

广度优先搜索:检查访问状态的时间

在有向图的广度优先搜索中(可能的循环),当节点出列时,其尚未被访问的所有子节点都被排队,并且该过程继续,直到该队列为空.

有一次,我以相反的方式实现它,其中所有节点的子节点都被排队,并且当节点出列时检查访问状态.如果之前已访问过出队的节点,则将其丢弃,并且该过程继续到队列中的下一个节点.

但结果是错误的.维基百科也说

深度优先搜索......非递归实现类似于广度优先搜索,但在两个方面与它不同:它使用堆栈而不是队列,并延迟检查是否已发现顶点顶点从堆栈中弹出,而不是在按下顶点之前进行此检查.

但是,我无法理解究竟是什么区别.为什么在弹出项目时首先进行深度搜索检查,并且排队之前必须检查广度优先搜索?

language-agnostic algorithm graph

11
推荐指数
2
解决办法
1875
查看次数

出队时将节点标记为在BFS上已访问

关于图上的BFS遍历只是一个简单而愚蠢的问题

我在许多站点上发现了BFS的伪代码几乎是这样的:

BFS (Graph, root):

create empty set S
create empty queue Q      
add root to S //mark as visited here
Q.enqueue(root)                      
while Q is not empty:
    current = Q.dequeue()
    if current is the goal:
        return current
    for each node n that is adjacent to current:
        if n is not in S:
            add n to S //mark as visited here
            Q.enqueue(n)
Run Code Online (Sandbox Code Playgroud)

我只是发现在给定节点出队列后将其标记为已访问,而不是在对一个给定节点进行标记时,将其标记为访问的节点稍微简单些,因为在后一种方法中,我们将需要编写一个额外的步骤。我知道这不是一件大事,但我想将一个节点标记为在一个地方而不是两个地方访问更有意义。更简洁,更容易记住甚至学习。

修改后的版本将如下所示:

BFS (Graph, root):

create empty set S
create empty queue Q      
Q.enqueue(root)                      
while Q is not empty: …
Run Code Online (Sandbox Code Playgroud)

graph-theory pseudocode breadth-first-search

5
推荐指数
1
解决办法
1701
查看次数