Эффективно выбирать случайный элемент из связанной хеш-таблицы?

Просто для практики (а не в качестве домашнего задания) я пытался решить эту проблему (CLRS, 3-е издание, упражнение 11.2-6):

Предположим, мы сохранили n ключей в хеш-таблице размера m, с коллизии разрешаются цепочкой, и что мы знаем длину каждого цепь, включая длину L самой длинной цепи. Опишите процедура, которая выбирает ключ равномерно случайным образом из числа ключей в хеш-таблице и возвращает его в ожидаемое время O (L * (1 + m / n)).

До сих пор я думал, что вероятность того, что каждый ключ будет возвращен, равна 1 / n. Если мы попытаемся получить случайное значение x от 1 до n, и попытаемся найти x-й ключ в последовательности, сначала отсортированной по ведру, а затем по цепочке в ведре, тогда потребуется O (m), чтобы найти правильное ведро, перейдя через ведра одно за другим и O (L) раз, чтобы получить нужный ключ в цепочке.

13
задан templatetypedef 25 December 2011 в 18:08
поделиться