Как насчет массива (или ArrayList
), который разделен на "выбранный" и "не выбранный"? Вы отслеживаете, где находится граница, и, чтобы выбрать, вы генерируете случайный индекс ниже границы, затем (так как вам не важен порядок), меняете элемент по этому индексу на последний не выбранный элемент и уменьшаете границу. , Чтобы снять выделение, вы просто увеличиваете границу.
Обновление: Забыл про удаление O (log (n)). Не так сложно, хотя, просто немного дороже памяти, если вы держите HashMap
идентификаторов в индексах.
Если вы поэкспериментируете, вы найдете различные реализации IndexedHashSet
, которые все работают более или менее по этому принципу - массив или ArrayList
плюс HashMap
.
(Хотелось бы увидеть более элегантное решение, если оно существует.)
Обновление 2: Хмм ... или фактическое удаление снова становится O (n), если вам нужно либо переписать массивы, либо переместить их вокруг?