您可以通过使用两个 python 列表来获得一个摊销的 O(1) 数据结构,一个保存 deque 的左半部分,另一个保存右半部分。前半部分被反转存储,因此双端队列的左端位于列表的后面。像这样的东西:
class mydeque(object):
def __init__(self):
self.left = []
self.right = []
def pushleft(self, v):
self.left.append(v)
def pushright(self, v):
self.right.append(v)
def popleft(self):
if not self.left:
self.__fill_left()
return self.left.pop()
def popright(self):
if not self.right:
self.__fill_right()
return self.right.pop()
def __len__(self):
return len(self.left) + len(self.right)
def __getitem__(self, i):
if i >= len(self.left):
return self.right[i-len(self.left)]
else:
return self.left[-(i+1)]
def __fill_right(self):
x = len(self.left)//2
self.right.extend(self.left[0:x])
self.right.reverse()
del self.left[0:x]
def __fill_left(self):
x = len(self.right)//2
self.left.extend(self.right[0:x])
self.left.reverse()
del self.right[0:x]
我不能 100% 确定这段代码与 python 列表的摊销性能之间的交互是否实际上导致每个操作的 O(1),但我的直觉是这样说的。