【问题标题】:Why do we delete s from the queue?为什么我们要从队列中删除 s?
【发布时间】:2014-08-26 23:14:01
【问题描述】:

我得到了以下算法:

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

在我的笔记中,有如下例子:

一开始是这样的:

在第一个“for”之后是这样的:

没看懂,为什么要从Q中删除s。

用命令u

【问题讨论】:

    标签: algorithm queue breadth-first-search


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我明白了!!!那么,功能应该是这样吗? Delete(Q,&amp;head,length){ ` x=Q[head]; if head=length{` head=1 } else head=head+1; return x } ?
    • @evinda 你错过了验证队列不为空的完整性检查,但除此之外 - 它似乎是正确的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2014-01-21
    相关资源
    最近更新 更多