Есть ли способ случайным образом получить элемент из С++ unordered_set в среднем за время O(1)? Вместо того, чтобы делать
std::unordered_set<int> s;
// initialize s
auto start = s.begin();
for (int i = 0; i < rand()%s.size()-1; ++i, ++start) {}
int randomNumber = *start;
Обновлено:
Мне нужно бороться за пост, поэтому я добавляю свои причины необходимости вышеперечисленного функционала.
Я играю с реализацией генератора лабиринтов. И как-то мне нужна структура данных, которая поддерживала бы:
- вставка/удаление в O(1)
- случайное извлечение элемента из структуры данных в O (1)
std::vector имеет произвольный доступ, но вставка/удаление обходится дорого
std::list не имеет произвольного доступа
std::set поддерживает произвольный доступ O(logN) и вставку/удаление O(logN), что прекрасно, но моя инициализация представляет собой отсортированную последовательность, которая легко нарушит ее баланс.
Поэтому я подумал, что хэш-таблица будет лучшим выбором, однако случайное извлечение элемента было бы нетривиальной задачей.
Спасибо за уделенное время.
rand
неправильно, аrand
следует считать устаревшим в пользу<random>
header, в любом случае). Более того, "произвольный доступ" обычно означает что-то другое. - person Konrad Rudolph   schedule 21.01.2015rand()%s.size()
всегда возвращает число больше, чемi
. Это означает, что вы получите доступ кn
элементам, так что это, очевидно,O(n)
. Это, вероятно, не то, что вы хотите, но это то, что вы получите. - person Rafael Lerm   schedule 21.01.2015i
, но увеличивается наstart
. Я предполагаю, что на самом деле OP хотел сделать что-то другое, а именно выбрать n случайных элементов… - person Konrad Rudolph   schedule 21.01.2015i
по-прежнему является условием цикла, поэтому я думаю, что наихудший случай все еще имеет место. Я до сих пор не решил, чего хочет ОП. Он либо выбирает n случайных элементов, и в этом случае вопрос O(1) просто глуп, либо он хочет получить один случайный элемент. - person Rafael Lerm   schedule 21.01.2015std::unordered_set
для выбора случайного числа из набора уникальных чисел? - person 101010   schedule 21.01.2015