Только для практики (а не в качестве домашнего задания) Я пытался решить эту проблему (КСПС, 3-е издание, упражнение 11.2-6):Эффективный выбор случайного элемента из цепочки хэшей?
Предположим, что мы храним п ключей в хэш-таблице размер m, с столкновений, разрешенных цепью, и что мы знаем длину каждой цепи , включая длину L самой длинной цепи. Опишите процедуру , которая произвольно выбирает ключ из числа ключей в хеш-таблице и возвращает его в ожидаемое время O (L * (1 + m/n)).
То, что я думал до сих пор, состоит в том, что вероятность возврата каждой клавиши равна 1/n. Если мы попытаемся получить случайное значение x от 1 до n и попытаемся найти xth ключ в последовательности, сначала отсортированной по ведро, а затем по цепочке в ковше, тогда для поиска правильного ведра потребуется O (m) через ведра один за другим и время O (L), чтобы получить правильный ключ в цепочке.
Где мой вопрос? – outis
Худший случай - это O (mn) для нахождения связанного объекта, но ожидаемое время (как говорит вопрос) равно O (1 + m/n) для каждого из них и будет O (L * (m/n + 1)) для все они. –
Как сохраняется информация о длине? Я думаю, что если в одном ведро есть все элементы, а остальные - ноль, вы даже не можете найти этот ковш быстрее, чем O (n). Есть ли какая-либо другая информация о том, где находятся эти элементы? – templatetypedef