为什么我们要从队列中删除s?

时间:2014-08-26 23:14:01

标签: algorithm queue breadth-first-search

我获得了以下算法:

Breadthfirstsearch(G,s)

for each u ∈ V \ {s}
     color[u]<-white
     d[u]<-oo
     p[u]<-Ø
color[s]<-gray
d[s]<-0
p[s]<-Ø
Q<-Ø // Q is a queue
Insert(Q,s)
while Q ≠ Ø
       u<-Delete(Q)
       for each v  ∈ Adj(u)
          if color[v]=white then
             color[v]<-gray
             d[v]=d[u]+1
             p[v]<-u
             Insert(Q,v)

       color[u]<-black

Delete(Q)
x<-Q[head[Q]]
if head[Q]=length[Q] then
   head[Q]<-1
else
   head[Q]<-head[Q]+1
return x

在我的笔记中,有以下示例:

enter image description here

一开始就是这样:

enter image description here

在第一个“for”之后,就像那样:

enter image description here

我还没理解,为什么我们从Q中删除s。

使用命令u&lt; -Delete(Q),u变为s的值,变量head [Q]在函数中发生变化,但在主程序中没有变化,或者我错了吗?

1 个答案:

答案 0 :(得分:2)

该方法的名称delete()有点误导,可能更好的名称是deleteAndReturnHead()。我们的想法是函数返回队列中的“旧”头部(在您的示例中为s),并将新头部设置为下一个元素(示例中为a)。

函数Delete()使用的是队列的实现是circular array这一事实。您将元素设置为return(在示例中为s),然后您只需将指示队列开始位置的指针前进到下一个元素。圆形部分位于:

if head[Q]=length[Q] then
   head[Q]<-1

如果指向头部的指针是最后一个索引,则将指针移动到数组的头部,这是要插入的下一个元素。

由于Q是通过引用传递的(并且每次传递都不会被复制),因此对它的任何更改都将反映到调用环境(BFS procdure)。