Как вы сказали, я полагаю, вам нужно создать структуру данных с deque
для вставки / удаления и set
для поиска O (1), например:
from collections import deque
class CircularBuffer:
def __init__(self, capacity):
self.queue = deque()
self.capacity = capacity
self.value_set = set()
def add(self, value):
if self.contains(value):
return
if len(self.queue) >= self.capacity:
self.value_set.remove(self.queue.popleft())
self.queue.append(value)
self.value_set.add(value)
def contains(self, value):
return value in self.value_set
тест и вывод
cb = CircularBuffer(10)
for i in range(20):
cb.add(i)
print(cb.queue)
print(cb.contains(10))
# deque([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
# True
Похожая идея реализовать простой LRU Cache , dict
+ double linked list
.
Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы. :)