Получение объекта по номеру
Версия от 04:08, 26 октября 2011; Antonkov (обсуждение | вклад)
Перестановки
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки размера n.
f[n]=n!
permutation[n] //искомая перестановка
was[n] //использовали ли мы уже эту цифру в перестановке
for i = 1 to n do //n - количество цифр в перестановке
alreadyWas = (numOfPermutation-1) div f[n-i] // сколько цифр уже полностью заняты перестановками с меньшим номером
numOfPermutation = ((numOfPermutation-1) mod f[n-i]) + 1
//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. alreadyWas+1, которая еще не занята
for j = 1 to n do
if was[j] = false
then cntFree++
if cntFree = alreadyWas+1
then ans[i] = j
was[j] = true
Сочетания
Рассмотрим алгоритм получения i-го в лексикографическом порядке размещения
- количество размещений из n по k placement[n] //искомое размещение was[n] //использовали ли мы уже эту цифру в размещении for i = 1 to k do //k - количество цифр в размещении alreadyWas = (numOfPlacement-1) div // сколько цифр уже полностью заняты перестановками с меньшим номером numOfPlacement = ((numOfPlacement-1) mod ) + 1 //сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. alreadyWas+1, которая еще не занята for j = 1 to n do if was[j] = false then cntFree++ if cntFree = alreadyWas+1 then ans[i] = j was[j] = true