Получение объекта по номеру — различия между версиями
Antonkov (обсуждение | вклад) |
Antonkov (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
== Перестановки == | == Перестановки == | ||
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки. | Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки. | ||
− | '''< | + | '''<f[n]=n! |
− | ''' | + | '''ans[n] ''//искомая перестановка''''' |
− | ''' | + | '''was[n] ''//использовали ли мы уже эту цифру в переставновке''''' |
− | '''for''' | + | '''for''' i = 1 '''to''' n '''do ''//n-это количество цифр в перестановке''''' |
− | ''' | + | ''' alreadyWas = (numOfPermutation-1) div f[n-i] ''' |
− | ''' | + | ''' numOfPermutation = (numOfPermutation-1) mod f[n-i] ''// сколько цифр уже полностью заняты предыдущими перестановками''''' |
'''''//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. AlreadyWas+1''''' | '''''//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. AlreadyWas+1''''' | ||
− | '''for''' | + | '''for''' j = 1 '''to''' n '''do''' |
− | '''if''' | + | '''if''' was[j] = false |
− | '''then ''' | + | '''then ''' cntFree++ |
− | '''if''' | + | '''if''' cntFree = AlreadyWas+1 |
− | '''then ''' | + | '''then ''' ans[i] = j |
− | + | was[j] =w true | |
Версия 01:54, 26 октября 2011
Перестановки
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки.
<f[n]=n! ans[n] //искомая перестановка was[n] //использовали ли мы уже эту цифру в переставновке for i = 1 to n do //n-это количество цифр в перестановке alreadyWas = (numOfPermutation-1) div f[n-i] numOfPermutation = (numOfPermutation-1) mod f[n-i] // сколько цифр уже полностью заняты предыдущими перестановками //сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. AlreadyWas+1 for j = 1 to n do if was[j] = false then cntFree++ if cntFree = AlreadyWas+1 then ans[i] = j was[j] =w true
Сочетания
for
dofor to do for if then return