O(n)是管理列表长度的必要结果。在
这里有一个解决方案。一般来说,这是以O(1)的形式运行的,并且由于dequeue方法中出现了一个额外的步骤,所以它有时是O(n)。在
当列表变得太大并触发清理时,会发生O(n)步骤。注意,一般来说,这应该在dequeue方法中专门完成。在外面做,往往会更精细,效率更低。在class FasterQueue:
def __init__(self, maxwaste=100):
self.items = []
self.nout = 0
self.maxwaste = maxwaste
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
if len(self.items):
retv = self.items[self.nout]
self.nout += 1
if self.nout >= self.maxwaste:
self.items = self.items[self.nout:]
self.nout =0
return retv
else:
print( 'empty' )
raise ValueError
def listQ(self):
return ' '.join( self.items[self.nout:] )
def isEmpty(self):
return self.nout == len(self.items)
def size(self):
return len(self.items) - self.nout
q = FasterQueue(5)
for n in range(10):
q.enqueue( str(n) )
print( 'queue size %d nout %d items %s'%(q.size(),q.nout,q.listQ()) )
print( q.items )
while True:
try:
print( 'dequeue %s'%q.dequeue() )
print( 'queue size %d nout %d items %s'%(q.size(),q.nout,q.listQ()) )
print( q.items )
except:
print( 'empty' )
break
运行上面的代码会产生以下输出,注意当超过maxwaste时会回收浪费的内存。为了演示操作,这里将Maxwaste设得很小。在
^{pr2}$