Подтвердить что ты не робот

Структура данных для выбора случайных элементов?

Кто-нибудь знает о структуре данных, которая эффективно поддерживает две операции?

  • Вставьте значение в структуру данных.
  • Отменить и вернуть запись из структуры данных с равномерной случайной вероятностью.

Это похоже на канонический "мешок из мрамора", который всегда появляется во вводных классах вероятности. Вы можете помещать произвольные мраморы в сумку и затем эффективно удалять мрамор в случайном порядке.

Лучшее решение, которое у меня есть, - это использовать самобалансирующееся двоичное дерево поиска (AVL, AA, red/black и т.д.) для хранения элементов. Это дает время вставки O (lg n). Чтобы удалить случайный элемент, выберите случайный индекс i, затем найдите и удалите i-й элемент из дерева. Если вы соответствующим образом внедрили структуру, это может быть сделано для выполнения в O (lg n) времени.

Эта среда исполнения, конечно, не плохая, но мне любопытно, возможно ли сделать лучше - возможно, O (1) для вставки и O (lg n) для детекций? Или, возможно, что-то, что работает в expected O (1), вставляет и удаляет с помощью хеш-функций? Или, возможно, более сильная амортизация?

Есть ли у кого-нибудь идеи о том, как сделать это асимптотически быстрее?

4b9b3361

Ответ 1

Да. Используйте вектор.

Чтобы вставить, просто поместите в конец и увеличьте размер. Чтобы удалить, выберите элемент произвольно, замените его содержимое конечным значением, затем выскочите конечное значение (т.е. Верните конечное значение и уменьшите размер вектора).

Обе операции амортизируются O (1).