我一直在尝试用 Python 实现队列,但遇到了问题。
我正在尝试使用列表来实现队列数据结构,但是我不太清楚如何进行 enqueue
和 dequeue
O(1) 操作。
我在网上看到的每个例子,似乎只是附加 enqueue
操作并从列表中删除 dequeue
操作的第一个元素。但这会使 dequeue
操作 O(n)(其中 n 是列表的大小)是否正确?
我错过了一些基本的东西吗?或者您是否必须使用 LinkedLists 来有效地实现 Queue?
import unittest
class Queue:
def __init__(self):
self._queue = []
self.size = 0
self.maxSize = 10
def enqueue(self, item):
if self.size < self.maxSize:
self._queue.append(item)
def dequeue(self):
'''
Removes an item from the front of the list. Remove first element of
the array
'''
first = self._queue[0]
del self._queue[0]
return first
原文由 random_coder_101 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如 Uri Goren 在上面敏锐地指出 的那样,Python 标准库已经为您幸运地实现了一个高效的队列:
collections.deque
。不该做什么
避免通过自己动手来重新发明轮子:
dequeue()
和enqueue()
方法到 O(1),collections.deque
类型已经这样做了。考虑到其基于 C 的传统,它也是线程安全的,并且可能具有更高的空间和时间效率。enqueue()
方法会将其最坏情况时间复杂度增加到 O(n)。 由于从基于 C 的数组中删除最后一项,因此 Python 列表是一个恒定时间操作,因此根据 Python 列表实现dequeue()
方法保留相同的最坏情况时间复杂度 O(1 ).但谁在乎?enqueue()
仍然慢得可怜。引用 官方
deque
文档:更关键的是,
deque
还 通过初始化时传递的maxlen
参数为最大长度提供了开箱即用的支持,无需手动尝试限制队列大小(由于 if 条件中隐含的竞争条件,这不可避免地破坏了线程安全)。该怎么办
相反,根据标准
collections.deque
类型实现您的Queue
类,如下所示:证据就在地狱般的布丁中:
一个人去很危险
实际上, 也不要那样做。
您最好只使用原始
deque
对象,而不是尝试将该对象手动封装在Queue
包装器中。上面定义的Queue
类 仅 作为deque
API 的通用实用程序的简单演示。deque
类提供了 更多的特性,包括:只需在需要单端或双端队列的任何地方使用
deque
。就这些。