Получение объекта по номеру — различия между версиями
Antonkov (обсуждение | вклад) (→Перестановки) |
Antonkov (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
== Перестановки == | == Перестановки == | ||
− | Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки. | + | Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки размера n. |
f[n]=n! | f[n]=n! | ||
permutation[n] ''//искомая перестановка'' | permutation[n] ''//искомая перестановка'' | ||
Строка 16: | Строка 16: | ||
== Сочетания == | == Сочетания == | ||
+ | Рассмотрим алгоритм получения i-го в лексикографическом порядке размещения <tex> A^k_n </tex> | ||
+ | <tex>A^{k}_{n} </tex> ''- количество размещений из n по k | ||
+ | placement[n] ''//искомое размещение'' | ||
+ | was[n] ''//использовали ли мы уже эту цифру в размещении'' | ||
+ | '''for''' i = 1 '''to''' k '''do''' ''//k - количество цифр в размещении'' | ||
+ | alreadyWas = (numOfPlacement-1) div <tex> A^{k-i}_{n-i} </tex> ''// сколько цифр уже полностью заняты перестановками с меньшим номером'' | ||
+ | numOfPlacement = ((numOfPlacement-1) mod <tex> A^{k-i}_{n-i} </tex>) + 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 | ||
== Размещения == | == Размещения == | ||
== Битовые вектора == | == Битовые вектора == | ||
== Скобочные последовательности == | == Скобочные последовательности == | ||
+ | == Разложение на слагаемые == |
Версия 04:08, 26 октября 2011
Содержание
Перестановки
Рассмотрим алгоритм получения 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