双端队列
双端队列,简称deques,是队列的广义形式队列.的元素可以添加或删除,这一点与队列完全类似头或的尾巴.
在这张图中,双端队列中目前有3个项目——两边的额外空间只是为了显示新项目可以放在哪里。在双端队列中,可以向两边添加或删除项目。因此,在4前面加一个4会导致4出现在6的左边。头在4上。另一方面,增加7会使7出现在2的右边。那么尾巴就在7上。
双端队列可以被认为是在餐厅等待的一排人。就像队列在美国,排在队伍前面的人可以得到帮助,他们可以在队伍后面加入队伍。然而,与队列不同的是,还可能发生两件事。在这个队伍中,排在队伍末尾的人如果不耐烦了,可以提前离开,点完菜后还可以再来点调味品。所以,增加和减少人员可能发生在这条线的两端。
最小所需功能
双端队列的问题
双端队列的问题
想象一下,在餐馆里有一排人正在接受帮助。的头这条线在前面。的尾巴队伍的最后面。
什么双端队列操作可以描述一个人因为不耐烦而离开队伍的末端?什么操作描述了某人回到前线取调味品?
双端队列与常规队列有什么不同?
A1。的delete_last
函数。的预谋
函数。A2。使用双端队列,您可以同时从队列的前端和尾部删除和添加项。在队列中,您只能将数据添加到后面,并将其从前面删除。
使用列表的Python实现示例
数据结构列表
可以实现双端队列,尽管效率不高:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
让我们看看这个实现的实际情况。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
时间复杂度
deques的时间复杂度取决于使用的数据结构的类型和构建的具体实现。下面是对加倍的复杂度分析链表而且动态数组:
操作 | 双链表 | 动态数组 |
附加 | ||
预谋 | ||
delete_last | ||
delete_first | ||
examine_last | ||
examine_first |
为数组,你仍然可以把出队列想象成一条线。如果你去掉了排在第一个的人,那么你就必须把所有人都往前推,所以运行时间是O(n)然而,如果你把排在队伍最后的人赶走——也许他们只是离开了队伍——那么你就不需要挪动其他人了。所以运行时间是O(1)同样的逻辑也适用于将人添加到这条线上。
在链表实现时,一切都是常数时间。这是因为,对于任何操作,您所要做的就是修改指向有问题的元素和邻居的指针。链表实现通常有指向尾巴deque的。这使得链表实现非常快。