O (n) является необходимым следствием управления длиной списка.
Вот решение.В общем, это работает как O (1), и время от времени это O (n) в результате дополнительного шага, который происходит внутри метода dequeue.
Шаг 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 установлен здесь небольшим с целью демонстрации операции.
queue size 10 nout 0 items 0 1 2 3 4 5 6 7 8 9
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
dequeue 0
queue size 9 nout 1 items 1 2 3 4 5 6 7 8 9
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
dequeue 1
queue size 8 nout 2 items 2 3 4 5 6 7 8 9
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
dequeue 2
queue size 7 nout 3 items 3 4 5 6 7 8 9
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
dequeue 3
queue size 6 nout 4 items 4 5 6 7 8 9
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
dequeue 4
queue size 5 nout 0 items 5 6 7 8 9
['5', '6', '7', '8', '9']
dequeue 5
queue size 4 nout 1 items 6 7 8 9
['5', '6', '7', '8', '9']
dequeue 6
queue size 3 nout 2 items 7 8 9
['5', '6', '7', '8', '9']
dequeue 7
queue size 2 nout 3 items 8 9
['5', '6', '7', '8', '9']
dequeue 8
queue size 1 nout 4 items 9
['5', '6', '7', '8', '9']
dequeue 9
queue size 0 nout 0 items
[]
empty
empty