Алгоритм, который я реализую, имеет структуру:
while C is not empty
select a random entry e from C
if some condition on e
append some new entries to C (I don't care where)
else
remove e from C
Важно, чтобы каждая итерация l oop e выбиралась случайным образом (с одинаковой вероятностью).
В идеале все шаги select
, append
и remove
- это O (1).
Если я правильно понимаю, при использовании std::list
шаги append
и remove
будут равны O (1). ) но случайный выбор будет O (n) (например, с использованием std::advance
, как в , это решение ).
, std::deque
и std::vector
, кажется, имеют дополняющее значение O ( 1) и операции O (n).
Я предполагаю, что std::set
привнесет некоторую сложность O (log n).
Существует ли контейнер stl, который поддерживает все три операции, которые Мне нужно в постоянное время (или амортизированное постоянное время)?