Возможно, вам это не понравится, потому что они, вероятно, ищут умное решение, но иногда стоит придерживаться ваших оружий ... хеш-таблица уже удовлетворяет требованиям - возможно, в целом лучше, чем все остальное будет (хотя, очевидно, в амортизированном постоянном времени и с другими компромиссами для других решений).
Хитрым требованием является выбор "случайного элемента": в хэш-таблице вам нужно будет отсканировать или исследовать такой элемент.
Для закрытой хеширования / открытой адресации вероятность того, что любой данный сегмент будет занят, составляет size() / capacity()
, но, что важно, это обычно поддерживается в постоянном мультипликативном диапазоне реализацией хэш-таблицы (например, таблица может быть больше, чем ее текущее содержание, скажем, от 1,2x до ~ 10x в зависимости от производительности / настройки памяти). Это означает, что в среднем мы можем ожидать поиск от 1,2 до 10 сегментов - полностью независимо от общего размера контейнера; амортизированный O (1).
Я могу представить два простых подхода (и еще много более причудливых):
линейный поиск по случайному интервалу
- рассмотрим пустые / сохраняющие значение сегменты ala "--AC ----- B - D": вы можете сказать, что первый "случайный" выбор справедлив, даже если он благоприятствует B, потому что B имел больше вероятности быть предпочтительным, чем другие элементы, но если вы делаете повторный «случайный» выбор, используя те же значения, то ясно, что B многократно предпочтительным может быть нежелательным (хотя ничто в вопросе не требует даже вероятностей)
неоднократно пробовать случайные группы, пока не найдете заполненный
- «только» емкость () / размер () в среднем посещенных сегментов (как указано выше) - но в практическом плане дороже, потому что генерация случайных чисел относительно дорога, и бесконечно плоха, если бесконечно невероятно наихудший случай поведение...
- более быстрым компромиссом будет использование списка предварительно сгенерированных случайных смещений из начального случайно выбранного сегмента,% -ное их включение в счетчик сегментов
Не очень хорошее решение, но все же может быть лучшим компромиссом, чем затраты памяти и производительности на поддержание второго индексного массива в любое время.