случайные перестановки
От: Аноним  
Дата: 12.10.06 11:05
Оценка:
Доброго времени суток!

Задача такая. Есть набор из N элементов (N достаточно велико, порядка сотен тысяч).

Требуется извлекать элементы из набора в случайном порядке. При этом, извлечение может быть приостановлено, и впоследствии возобновлено с того же места (т.е. нужно иметь возможность сохранять/восстанавливать текущий порядок перетасованных элементов, а также не выдавать повторно уже извлеченные до приостановки элементы). Объем сохраняемых данных должен быть минимальным по отношению к N -- в идеале, O(1).

Текущая идея реализации использует рабочую таблицу перестановок:

Подготовка:
Переменные:
   N -- кол-во элементов
   x0 -- начальное состояние ГПСЧ
   cnt -- счетчик уже выданных элементов

1. Выделяем память под рабочую таблицу индексов T[N] // размер зависит от N -- хотелось бы избежать
2. Инициализируем ГПСЧ (a la randomize()) и сохраняем его состояние в переменной x0
3. Заполняем T[i] := i, i in [0, N)
4. Перемешиваем таблицу T, используя ГПСЧ
5. Устанавливаем cnt := 0


Получение элемента:
1. Вернуть элемент ElementTable[ T[cnt] ]
2. cnt := cnt + 1


При приостановке требуется сохранить только x0 и cnt.
При восстановлении используется такая же процедура, как и при подготовке, только на шагах 2 и 5 используются сохраненные значения x0 и cnt вместо randomize() и 0, соответственно.

Собственно, вопрос: нельзя ли как-нибудь избавиться от таблицы T с размером O(N)?

Большое спасибо всем дочитавшим до конца
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.