Получение объекта по номеру — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
== Перестановки ==
 
== Перестановки ==
 
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки размера n.
 
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки размера n.
   f[n]=n!
+
   <tex>P_{n} </tex> ''- количество перестановок размера n
   permutation[n]                                     ''//искомая перестановка''
+
   permutation[n] ''- искомая перестановка''
   was[n]                                             ''//использовали ли мы уже эту цифру в перестановке''
+
   was[n] ''- использовали ли мы уже эту цифру в перестановке''
 
   '''for'''  i = 1  '''to'''  n  '''do'''                              ''//n - количество цифр в перестановке''
 
   '''for'''  i = 1  '''to'''  n  '''do'''                              ''//n - количество цифр в перестановке''
     alreadyWas = (numOfPermutation-1) div f[n-i]     ''// сколько цифр уже полностью заняты перестановками с меньшим номером''
+
     alreadyWas = (numOfPermutation-1) div <tex>P_{n} </tex>     ''// сколько цифр уже полностью заняты перестановками с меньшим номером''
     numOfPermutation = ((numOfPermutation-1) mod f[n-i]) + 1  
+
     numOfPermutation = ((numOfPermutation-1) mod <tex>P_{n} </tex>) + 1  
 
     ''//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. alreadyWas+1, которая еще не занята''
 
     ''//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. alreadyWas+1, которая еще не занята''
 
     '''for'''  j = 1  '''to'''  n  '''do'''
 
     '''for'''  j = 1  '''to'''  n  '''do'''
Строка 18: Строка 18:
 
Рассмотрим алгоритм получения i-го в лексикографическом порядке размещения <tex> A^k_n </tex>
 
Рассмотрим алгоритм получения i-го в лексикографическом порядке размещения <tex> A^k_n </tex>
 
   <tex>A^{k}_{n} </tex> ''- количество размещений из n по k
 
   <tex>A^{k}_{n} </tex> ''- количество размещений из n по k
   placement[n]                                       ''//искомое размещение''
+
   placement[n] ''- искомое размещение''
   was[n]                                             ''//использовали ли мы уже эту цифру в размещении''
+
   was[n] ''- использовали ли мы уже эту цифру в размещении''
 
   '''for'''  i = 1  '''to'''  k  '''do'''                              ''//k - количество цифр в размещении''
 
   '''for'''  i = 1  '''to'''  k  '''do'''                              ''//k - количество цифр в размещении''
     alreadyWas = (numOfPlacement-1) div <tex> A^{k-i}_{n-i} </tex>      ''// сколько цифр уже полностью заняты перестановками с меньшим номером''
+
     alreadyWas = (numOfPlacement-1) div <tex> A^{k-i}_{n-i} </tex>      ''// сколько цифр уже полностью заняты размещениями с меньшим номером''
 
     numOfPlacement = ((numOfPlacement-1) mod <tex> A^{k-i}_{n-i} </tex>) + 1  
 
     numOfPlacement = ((numOfPlacement-1) mod <tex> A^{k-i}_{n-i} </tex>) + 1  
 
     ''//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. alreadyWas+1, которая еще не занята''
 
     ''//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. alreadyWas+1, которая еще не занята''

Версия 04:11, 26 октября 2011

Перестановки

Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки размера n.

 [math]P_{n} [/math] - количество перестановок размера n
 permutation[n] - искомая перестановка
 was[n] - использовали ли мы уже эту цифру в перестановке
 for  i = 1  to  n  do                               //n - количество цифр в перестановке
   alreadyWas = (numOfPermutation-1) div [math]P_{n} [/math]      // сколько цифр уже полностью заняты перестановками с меньшим номером
   numOfPermutation = ((numOfPermutation-1) mod [math]P_{n} [/math]) + 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-го в лексикографическом порядке размещения [math] A^k_n [/math]

 [math]A^{k}_{n} [/math] - количество размещений из n по k
 placement[n] - искомое размещение
 was[n] - использовали ли мы уже эту цифру в размещении
 for  i = 1  to  k  do                               //k - количество цифр в размещении
   alreadyWas = (numOfPlacement-1) div [math] A^{k-i}_{n-i} [/math]      // сколько цифр уже полностью заняты размещениями с меньшим номером
   numOfPlacement = ((numOfPlacement-1) mod [math] A^{k-i}_{n-i} [/math]) + 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

Размещения

Битовые вектора

Скобочные последовательности

Разложение на слагаемые