Получение объекта по номеру — различия между версиями
Antonkov (обсуждение | вклад) |
Antonkov (обсуждение | вклад) (→Перестановки) |
||
| Строка 1: | Строка 1: | ||
== Перестановки == | == Перестановки == | ||
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки. | Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки. | ||
| − | + | <source lang="c"> | |
| − | + | f[n]=n! | |
| − | + | ans[n] ''//искомая перестановка''''' | |
| + | was[n] ''//использовали ли мы уже эту цифру в переставновке''''' | ||
'''for''' i = 1 '''to''' n '''do ''//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''' | '''for''' j = 1 '''to''' n '''do''' | ||
'''if''' was[j] = false | '''if''' was[j] = false | ||
| Строка 13: | Строка 14: | ||
'''if''' cntFree = AlreadyWas+1 | '''if''' cntFree = AlreadyWas+1 | ||
'''then ''' ans[i] = j | '''then ''' ans[i] = j | ||
| − | was[j] =w true | + | was[j] =w true |
| − | + | </source> | |
| − | |||
== Сочетания == | == Сочетания == | ||
Версия 01:57, 26 октября 2011
Перестановки
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки. <source lang="c">
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
</source>
Сочетания
for
do for to do for if then return