📜  门|门CS 2008 |问题 17

📅  最后修改于: 2021-09-24 05:31:45             🧑  作者: Mango

广度优先搜索算法是使用队列数据结构实现的。访问下图中节点的一种可能顺序是
(一) MNOPQR
(B) NQMPOR
(C) QMNPRO
(D) QMNPOR答案: (C)
解释:广度优先搜索首先访问“广度”,即如果它正在访问一个节点,然后在访问该节点之后,它将首先访问邻居节点(子节点),然后再移动到下一级邻居。

让我们看看如何。

最初:如果 BFS 从节点 Q 开始,它首先访问 Q 并将 Q 放入队列中。

所以,队列包含:Q。

并且,访问顺序是:Q。

现在它使 Q 出列,并探索它的邻居,即 {M,N,P}。它检查 Q 的那些尚未访问的邻居,然后访问它们,并将它们放入队列中(以便以后可以访问它们的邻居)。

现在,可以访问这些邻居并将它们按任何顺序放入队列中(取决于实现)。

假设它访问并将它们按顺序 ( MNP ) 放入队列中,其中 M 位于 FRONT,P 位于 REAR。

所以,访问顺序:QMNP。

现在,它寻找队列中的下一个条目。由于队列遵循先进先出原则,M 出队。

队列包含:(NP)

它探索 M,找到它的邻居 { N, Q, R },但在访问它们之前,它会检查这些节点是否更早被访问过,它只会访问那些尚未访问的节点并将其放入队列中。由于之前已经访问过 N 和 Q,因此它只会访问 R 并将其入队。

访问顺序:QMNPR。
队列包含:( NPR )。

现在,N 出列了。

队列包含:( PR )。

它探索 N,找到它的邻居 { M, O, Q }。由于 M 和 Q 之前已经被访问过,它只会访问和排队 O。

参观顺序:QMNPRO。
队列包含:(专业版)。

现在,P 出列了。

队列包含:(RO)。

它探索 P,找到它的邻居 { O, Q }。由于 O 和 Q 较早被访问过,因此不会入队。

现在,R 出列了。

队列包含:(O)。

它探索 R,找到它的邻居 { M }。由于 M 之前已经被访问过,它不会入队。

现在,O 出列了。

队列包含:()。

它探索 O,找到它的邻居 { N, P }。由于两者都已被访问过,因此不会入队。

现在 Queue 是空的,因此 BFS 停在这里。

并且访问顺序是:QMNPRO。

上述解释的伪代码可以在 https://en.wikipedia.org/wiki/Breadth-first_search 找到
这个问题的测验