【发布时间】:2019-01-02 17:56:52
【问题描述】:
我目前正在阅读一本关于数据结构/算法的教科书。练习之一是使用 python 列表结构实现一个高效的队列:入队和出队的时间复杂度平均需要 O(1)。这本书说,对于特定的出队情况,时间复杂度应该只有 O(n),其余时间应该是 O(1)。我实现了它,队列的后部是列表的末尾,队列的前部是列表的开头;当我使一个元素出队时,我不会从列表中删除它,而是简单地增加一个计数器,以便该方法知道列表中的哪个元素代表队列的前面。这是我的代码:
class FasterQueue:
def __init__(self):
self.items = []
self.index = 0
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
index = self.index
self.index += 1
return self.items[index]
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
我的问题:这本书说在某些情况下出队应该采用 O(1)。我不知道这是什么情况,因为似乎出队总是会在某个索引处获得值。我的队列实现是无效的还是我错过了其他东西?还是教科书只是在寻找另一种更常见的实现方式?
非常感谢您的帮助。
【问题讨论】:
-
dequeue应该始终从队列的一端删除该项目。那是O(1) -
@JacobIRR 他没有使用典型的python列表,实现代表一个队列。队列是先进先出的,因此出队应该从队列的开头移除,而不是结尾。
-
我想我能想到的唯一一件事是,当您尝试从“空”队列中出队时会发生什么。入队一次,出队两次。
-
这不是 O(1),因为获取列表项的最坏情况是 O(1)...我猜教科书只是犯了一个错误?
-
我认为这实际上可能是一个索引错误,但是是的,我真的没有看到任何“理由”有一个令人难以置信的长列表,它不断消耗内存但出队为 O(1),但我怀疑这本书希望您在清空列表或其他内容时整理列表。
标签: python data-structures queue time-complexity