我通常在生产软件中的哪里使用Deque?


21

我对在软件应用程序中的堆栈,队列和树的使用位置相当熟悉,但是我之前从未使用过Deque(双端队列)。我通常会在野外遇到什么地方?它会和Queue放在同一个地方,但又有更多的功能吗?



似乎这个线程有些混乱。在互联网上,“双端队列”是一个双端队列(维基百科提到了链表的实现)。但是,在C ++ STL中,“ std :: deque”是一种类似数组的结构,实现为数据块数组。它提供类似于std :: vector的随机访问,但是它的调整大小功能接近于std :: list的调整大小功能,因为添加数据时,它会添加块,并且不会重新分配和移动现有数据。
DXM 2012年

1
@DXM:尽管STL双端队列仍然是双端队列,并且在末端提供更快的操作(取决于实现)。它也提供了对中间对象的访问权限,这并不会使它的主要操作变得像队列一样。
gbjbaanb 2012年

@gbjbaanb:我要说的是,如果您查看3类的公共接口:std :: vector,std :: list(或std :: queue)和std :: deque,您将看到std :: vector和std :: deque具有相同的公共接口和相同的功能(std :: deque稍微更灵活,但会占用更大的内存空间)。另一方面,std :: list和std :: queue的行为更像是CS的对应部分,链表和队列。CS deque!= std :: deque
DXM 2012年

我觉得这个答案由shiv.mymail更实用- stackoverflow.com/questions/3880254/...
roottraveller

Answers:


21

使用双端队列的一种方法是“老化”项目。它通常用作撤消或历史记录功能。一个新的动作被插入双端队列。最旧的物品在前面。对双端队列大小的限制会在插入新项目(最旧的项目)时在某些时候强制删除前面的项目。然后,它提供了一种访问结构两端的快速方法,因为您可以立即知道最旧和最新的项,以便在O(1)中删除最前面的内容并提交最旧的操作,或者在O(1)时间内撤消操作。


我认为这里没有使用/不需要双端队列。一个简单的(也许受大小限制)堆栈就足够了。
康拉德·鲁道夫2012年

2
@Konrad您如何在简单的堆栈中老化物品?(即,如何删除“太旧”的命令?)
Andres F.

@AndresF。年龄是否与纸叠大小无关?如果是这样,那么我就从未听说过这种数据结构。否则,它简单地与可被实现固定尺寸的堆叠来讲一个双端队列,或简单地通过假定称为固定大小的堆栈中的较简单的数据结构。
康拉德·鲁道夫2012年

因此,双端都是毕竟有用)从来没有听说过一个固定大小的堆栈(在这个意义上你的意思,去除最旧的项目)。这是有道理的,但这不是通常所说的“堆栈”,它是否实际上更简单还有待观察:)
Andres F.

这是在原始问题的评论中发布的:en.wikipedia.org/wiki/Double-ended_queue这只是一个双头队列。我已经按照上面概述的方式在实践中使用了它(这就是我发布它的原因)。在真正的堆栈中,您应具有的唯一操作是推,弹出,顶部和窥视(我们可能会争论其他人,但这通常就是这样)。您应该不了解堆栈底部的内容,甚至不知道如何访问底部的内容。在“固定大小的堆栈”中,您只会生成堆栈溢出,而不是在填充旧项目时对其进行老化。
2012年

1

很好的问题。我不记得我们的CS 102课程提到了双端队列的单个应用程序。

到目前为止,我所知道的唯一应用程序是Wikipedia文章中提到的窃取工作计划程序。

它的工作原理如下:

在正常的单线程过程模型中,每个函数调用都将激活记录推送到所谓的调用堆栈上。激活记录包含该调用的局部变量和参数。一旦对该方法的调用完成(“返回”),将从调用堆栈中弹出最后一个激活记录。

这一点特别重要,因为这就是实现递归的方式:递归的结构以调用堆栈的当前状态表示。

在并行处理递归算法时,我们可以通过用调用队列替换调用堆栈来利用此属性。计算中的每个线程都有自己的调用队列,并像顺序执行一样推送和弹出激活记录。

但是,一旦线程完成工作(=其调用队列为空),它就通过从“错误”端删除从该线程的调用队列中删除激活记录,从而从另一个线程中窃取了工作。

基本上,调用队列充当两个现在服务于两个线程的调用堆栈。


你有这个来源吗?听起来不错。
kyjelly90210

1
@ Richard1987维基百科文章引用了原始论文。存在几种实现方式,例如,在GNU c ++ stdlib并行扩展工作窃取实现中(但是代码很难读),或者由您真正实现的广义分治并行实现(但是后者使用了非常惯用的编程风格)尤其是图书馆,因此很难阅读)
康拉德·鲁道夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.