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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Перестановки)
Строка 1: Строка 1:
 
== Перестановки ==
 
== Перестановки ==
 
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки.
 
Рассмотрим алгоритм получения i-ой в лексикографическом порядке перестановки.
<source lang="c">
 
 
   f[n]=n!
 
   f[n]=n!
   ans[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 f[n-i]             ''// сколько цифр уже полностью заняты предыдущими перестановками''
     numOfPermutation = (numOfPermutation-1) mod f[n-i]   ''// сколько цифр уже полностью заняты предыдущими перестановками'''''
+
     numOfPermutation = ((numOfPermutation-1) mod f[n-i]) + 1
   ''//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. AlreadyWas+1'''''
+
   ''//сейчас мы должны поставить ту цифру, которая еще полностью не занята, т.е. alreadyWas+1'''''
  '''for'''  j = 1  '''to'''  n  '''do'''
+
    '''for'''  j = 1  '''to'''  n  '''do'''
    '''if'''  was[j] = false   
+
      '''if'''  was[j] = false   
      '''then '''  cntFree++  
+
        '''then '''  cntFree++  
    '''if'''  cntFree = AlreadyWas+1   
+
      '''if'''  cntFree = alreadyWas+1   
      '''then '''  ans[i] = j  
+
        '''then '''  ans[i] = j  
            was[j] =w true
+
              was[j] = true
</source>
+
== Сочетания ==
  
== Сочетания ==
 
'''for''' <tex>v \in V</tex>
 
  '''do''' <tex>d[v] \gets +\infty</tex>
 
<tex>d[s] \gets 0</tex>
 
'''for''' <tex>i \gets 1</tex> '''to''' <tex>|V| - 1</tex>
 
  '''do for''' <math>(u, v) \in E</math>
 
    '''if''' <tex>d[v] > d[u] + w(u, v)</tex>
 
      '''then''' <tex>d[v] \gets d[u] + w(u, v)</tex>
 
'''return''' <tex>d</tex>
 
 
== Размещения ==
 
== Размещения ==
 
== Битовые вектора ==
 
== Битовые вектора ==
 
== Скобочные последовательности ==
 
== Скобочные последовательности ==

Версия 03:27, 26 октября 2011

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

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

 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

Сочетания

Размещения

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

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