<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dima32ml</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dima32ml"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Dima32ml"/>
		<updated>2026-08-03T23:04:04Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D1%83&amp;diff=42174</id>
		<title>Получение объекта по номеру</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D1%83&amp;diff=42174"/>
				<updated>2014-12-14T11:31:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Перестановки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Получаем элементы объекта по порядку: сначала определим, какой элемент будет стоять на первом месте, потом на втором и так далее. Считаем, что мы нашли первые &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; элементов объекта. Для всех вариантов элемента, который может стоять на позиции с номером &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;, посчитаем диапазон номеров, который будет соответствовать объектам с данным префиксом. Если искомый номер входит в один из диапазонов, то, очевидно, мы нашли элемент, который должен стоять на месте с номером &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;. Диапазоны номеров не пересекаются, значит на это место больше нельзя поставить никакой другой элемент.&lt;br /&gt;
&lt;br /&gt;
*В начале каждого шага &amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} номер нужного объекта среди тех, у которых префикс до &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го элемента лексикографически равен префиксу нашего объекта. &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; {{---}} количество мест в комбинаторном объекте (например, битовый вектор длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{k}&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2&amp;lt;/tex&amp;gt;, поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.  Все элементы занумерованы в лексикографическом порядке, начиная с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Комбинаторные объекты занумерованы с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Переход к нумерации с единицы можно сделать с помощью одной операции декремента перед проходом алгоритма. &lt;br /&gt;
 '''function''' num2object(numOfObject: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n                     &lt;br /&gt;
     '''for''' j = 1 '''to''' k                      &lt;br /&gt;
       '''if''' j-й элемент можно поставить на i-e место &lt;br /&gt;
         '''if''' numOfObject &amp;gt;= (количество комбинаторных объектов с префиксом object[1..i-1] и элементом j на месте i)&lt;br /&gt;
           numOfObject -= (количество комбинаторных объектов с префиксом object[1..i-1] и элементом j на месте i)&lt;br /&gt;
         '''else'''&lt;br /&gt;
           object[i] = j        &lt;br /&gt;
   '''return''' object&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. Стоит отметить, что подсчет количества комбинаторных объектов с заданным префиксом зачастую является задачей с достаточно большой вычислительной сложностью. &lt;br /&gt;
Приведем примеры получения некоторых [[Комбинаторные объекты|комбинаторных объектов]] по номеру.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ой в [[Лексикографический порядок|лексикографическом порядке]] перестановки размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Заметим, что всем префиксам на каждом шаге будет соответствовать диапазон номеров одинакового размера, (так как количество всевозможных суффиксов зависит только от длины) то есть можем просто посчитать &amp;quot;количество диапазонов, которые идут до нас&amp;quot; (количество цифр уже полностью занятых перестановками с меньшим номером) за &amp;lt;tex&amp;gt;O(1) &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{k}&amp;lt;/tex&amp;gt; {{---}} номер искомой последовательности&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n!}&amp;lt;/tex&amp;gt; {{---}} количество перестановок размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{permutation[n]}&amp;lt;/tex&amp;gt; {{---}} искомая перестановка.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{alreadyWas}&amp;lt;/tex&amp;gt; {{---}} сколько цифр уже полностью заняты перестановками с меньшим номером.&lt;br /&gt;
&lt;br /&gt;
*мы должны поставить ту цифру, которая еще полностью не занята, то есть цифру с номером &amp;lt;tex&amp;gt;alreadyWas + 1&amp;lt;/tex&amp;gt;. Среди цифр, которых еще нет в нашем префиксе, считаем, что это цифра &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-ом шаге:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{curFree}&amp;lt;/tex&amp;gt; {{---}} если элемент с номером &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; свободен, то он имеет номер curFree среди всех свободных элементов с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''function''' num2permutation(k: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                               &lt;br /&gt;
     alreadyWas = k div (n-i)!      &lt;br /&gt;
     k = k mod (n-i)!&lt;br /&gt;
     curFree = 0&lt;br /&gt;
     '''for''' j = 1 '''to''' n  &lt;br /&gt;
       '''if''' was[j] == false &lt;br /&gt;
         curFree++&lt;br /&gt;
         '''if''' curFree == alreadyWas + 1&lt;br /&gt;
           permutation[i] = j&lt;br /&gt;
           was[j] = true&lt;br /&gt;
   '''return''' permutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, так как в случае перестановок &amp;lt;tex&amp;gt;n=k&amp;lt;/tex&amp;gt;. Мы можем посчитать все &amp;lt;tex&amp;gt;\mathtt{n!}&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;. Асимптотику можно улучшить &lt;br /&gt;
до &amp;lt;tex&amp;gt;O(n \log {n}) &amp;lt;/tex&amp;gt;, если использовать структуры данных (например, [[Декартово дерево|декартово дерево]] по неявному ключу), которые позволяют искать &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент множества и удалять элемент &lt;br /&gt;
множества за &amp;lt;tex&amp;gt;O( \log {n}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ого в лексикографическом порядке битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
При построении битовых векторов можно не проверять условие возможности постановки какого-то объекта на текущее место. На каждый позиции может стоять один из двух элементов, независимо от того, какие элементы находятся в префиксе. Так как у нас всего два возможных элемента, упростим второй цикл до условия: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[n]}&amp;lt;/tex&amp;gt; {{---}} искомый битовый вектор&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} номер искомого вектора среди всех битовых векторов&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{pow(2, n)}&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;2^{n}&amp;lt;/tex&amp;gt; количество битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''function''' num2bitvector(numOfBitvector: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' numOfBitvector &amp;gt;= pow(2, (n-i))&lt;br /&gt;
      numOfBitvector -= pow(2, (n-i))&lt;br /&gt;
      bitvector[i] = 1&lt;br /&gt;
    '''else'''&lt;br /&gt;
      bitvector[i] = 0    &lt;br /&gt;
   '''return''' bitvecor    &lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, так как в случае битовых векторов &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; не зависит от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. &lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение номера по объекту|Получение номера по объекту]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31 - ISBN 5-94774-010-9&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D1%83&amp;diff=42024</id>
		<title>Получение объекта по номеру</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D1%83&amp;diff=42024"/>
				<updated>2014-12-10T13:48:09Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Получаем элементы объекта по порядку: сначала определим, какой элемент будет стоять на первом месте, потом на втором и так далее. Считаем, что мы нашли первые &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; элементов объекта. Для всех вариантов элемента, который может стоять на позиции с номером &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;, посчитаем диапазон номеров, который будет соответствовать объектам с данным префиксом. Если искомый номер входит в один из диапазонов, то, очевидно, мы нашли элемент, который должен стоять на месте с номером &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;. Диапазоны номеров не пересекаются, значит на это место больше нельзя поставить никакой другой элемент.&lt;br /&gt;
&lt;br /&gt;
*В начале каждого шага &amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} номер нужного объекта среди тех, у которых префикс до &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го элемента лексикографически равен префиксу нашего объекта. &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; {{---}} количество мест в комбинаторном объекте (например, битовый вектор длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{k}&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2&amp;lt;/tex&amp;gt;, поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.  Все элементы занумерованы в лексикографическом порядке, начиная с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Комбинаторные объекты занумерованы с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Переход к нумерации с единицы можно сделать с помощью одной операции декремента перед проходом алгоритма. &lt;br /&gt;
 '''function''' num2object(numOfObject: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n                     &lt;br /&gt;
     '''for''' j = 1 '''to''' k                      &lt;br /&gt;
       '''if''' j-й элемент можно поставить на i-e место &lt;br /&gt;
         '''if''' numOfObject &amp;gt;= (количество комбинаторных объектов с префиксом object[1..i-1] и элементом j на месте i)&lt;br /&gt;
           numOfObject -= (количество комбинаторных объектов с префиксом object[1..i-1] и элементом j на месте i)&lt;br /&gt;
         '''else'''&lt;br /&gt;
           object[i] = j        &lt;br /&gt;
   '''return''' object&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. Стоит отметить, что подсчет количества комбинаторных объектов с заданным префиксом зачастую является задачей с достаточно большой вычислительной сложностью. &lt;br /&gt;
Приведем примеры получения некоторых [[Комбинаторные объекты|комбинаторных объектов]] по номеру.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ой в [[Лексикографический порядок|лексикографическом порядке]] перестановки размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Заметим, что всем префиксам на каждом шаге будет соответствовать диапазон номеров одинакового размера, (так как количество всевозможных суффиксов зависит только от длины) то есть можем просто посчитать &amp;quot;количество диапазонов, которые идут до нас&amp;quot; (количество цифр уже полностью занятых перестановками с меньшим номером) за &amp;lt;tex&amp;gt;O(1) &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{k}&amp;lt;/tex&amp;gt; {{---}} номер искомой последовательности&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n!}&amp;lt;/tex&amp;gt; {{---}} количество перестановок размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{permutation[n]}&amp;lt;/tex&amp;gt; {{---}} искомая перестановка.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{alreadyWas}&amp;lt;/tex&amp;gt; {{---}} сколько цифр уже полностью заняты перестановками с меньшим номером.&lt;br /&gt;
&lt;br /&gt;
*мы должны поставить ту цифру, которая еще полностью не занята, то есть цифру с номером &amp;lt;tex&amp;gt;alreadyWas + 1&amp;lt;/tex&amp;gt;. Среди цифр, которых еще нет в нашем префиксе, считаем, что это цифра &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-ом шаге:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{curFree}&amp;lt;/tex&amp;gt; {{---}} если элемент с номером &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; свободен, то он имеет номер curFree среди всех свободных элементов с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''function''' num2permutation(k: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                               &lt;br /&gt;
     alreadyWas = k div (n-i)!      &lt;br /&gt;
     k = k mod (n-i)!&lt;br /&gt;
     curFree = 0&lt;br /&gt;
     '''for''' j = 1 '''to''' n  &lt;br /&gt;
       '''if''' was[j] == false &lt;br /&gt;
         curFree++&lt;br /&gt;
         '''if''' curFree == alreadyWas + 1&lt;br /&gt;
           permutation[i] = j&lt;br /&gt;
           was[j] = true&lt;br /&gt;
   '''return''' permutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, так как в случае перестановок &amp;lt;tex&amp;gt;n=k&amp;lt;/tex&amp;gt;. Мы можем посчитать все &amp;lt;tex&amp;gt;n!&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;. Асимптотику можно улучшить &lt;br /&gt;
до &amp;lt;tex&amp;gt;O(n \log {n}) &amp;lt;/tex&amp;gt;, если использовать структуры данных (например, [[Декартово дерево|декартово дерево]] по неявному ключу), которые позволяют искать &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент множества и удалять элемент &lt;br /&gt;
множества за &amp;lt;tex&amp;gt;O( \log {n}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ого в лексикографическом порядке битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
При построении битовых векторов можно не проверять условие возможности постановки какого-то объекта на текущее место. На каждый позиции может стоять один из двух элементов, независимо от того, какие элементы находятся в префиксе. Так как у нас всего два возможных элемента, упростим второй цикл до условия: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[n]}&amp;lt;/tex&amp;gt; {{---}} искомый битовый вектор&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} номер искомого вектора среди всех битовых векторов&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{pow(2, n)}&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;2^{n}&amp;lt;/tex&amp;gt; количество битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''function''' num2bitvector(numOfBitvector: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' numOfBitvector &amp;gt;= pow(2, (n-i))&lt;br /&gt;
      numOfBitvector -= pow(2, (n-i))&lt;br /&gt;
      bitvector[i] = 1&lt;br /&gt;
    '''else'''&lt;br /&gt;
      bitvector[i] = 0    &lt;br /&gt;
   '''return''' bitvecor    &lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, так как в случае битовых векторов &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; не зависит от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. &lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение номера по объекту|Получение номера по объекту]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31 - ISBN 5-94774-010-9&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D1%83&amp;diff=42023</id>
		<title>Получение объекта по номеру</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D1%83&amp;diff=42023"/>
				<updated>2014-12-10T13:39:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Получаем элементы объекта по порядку: сначала определим какой элемент будет стоять на первом месте, потом на втором и так далее. Считаем, что мы нашли первые &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; элементов объекта. Для всех вариантов элемента, который может стоять на позиции с номером &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;, посчитаем диапазон номеров, который будет соответствовать объектам с данным префиксом. Если искомый номер входит в один из диапазонов, то, очевидно, мы нашли элемент, который должен стоять на месте с номером &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;. Диапазоны номеров не пересекаются, значит на это место больше нельзя поставить никакой другой элемент.&lt;br /&gt;
&lt;br /&gt;
*В начале каждого шага &amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} номер нужного объекта среди тех, у которых префикс до &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го элемента лексикографически равен префиксу нашего объекта. &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; {{---}} количество мест в комбинаторном объекте (например, битовый вектор длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{k}&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2&amp;lt;/tex&amp;gt;, поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.  Все элементы занумерованы в лексикографическом порядке, начиная с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Комбинаторные объекты занумерованы с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Переход к нумерации с единицы можно сделать с помощью одной операции декремента перед проходом алгоритма. &lt;br /&gt;
 '''function''' num2object(numOfObject: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n                     &lt;br /&gt;
     '''for''' j = 1 '''to''' k                      &lt;br /&gt;
       '''if''' j-й элемент можно поставить на i-e место &lt;br /&gt;
         '''if''' numOfObject &amp;gt;= (количество комбинаторных объектов с префиксом object[1..i-1] и элементом j на месте i)&lt;br /&gt;
           numOfObject -= (количество комбинаторных объектов с префиксом object[1..i-1] и элементом j на месте i)&lt;br /&gt;
         '''else'''&lt;br /&gt;
           object[i] = j        &lt;br /&gt;
   '''return''' object&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. Стоит отметить, что подсчет количества комбинаторных объектов с заданным префиксом зачастую является задачей с достаточно большой вычислительной сложностью. &lt;br /&gt;
Приведем примеры получения некоторых [[Комбинаторные объекты|комбинаторных объектов]] по номеру.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ой в [[Лексикографический порядок|лексикографическом порядке]] перестановки размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Заметим, что всем префиксам на каждом шаге будет соответствовать диапазон номеров одинакового размера, (так как количество всевозможных суффиксов зависит только от длины) то есть можем просто посчитать &amp;quot;количество диапазонов, которые идут до нас&amp;quot; (количество цифр уже полностью занятых перестановками с меньшим номером) за &amp;lt;tex&amp;gt;O(1) &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{k}&amp;lt;/tex&amp;gt; {{---}} номер искомой последовательности&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n!}&amp;lt;/tex&amp;gt; {{---}} количество перестановок размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{permutation[n]}&amp;lt;/tex&amp;gt; {{---}} искомая перестановка.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{alreadyWas}&amp;lt;/tex&amp;gt; {{---}} сколько цифр уже полностью заняты перестановками с меньшим номером.&lt;br /&gt;
&lt;br /&gt;
*мы должны поставить ту цифру, которая еще полностью не занята, то есть цифру с номером &amp;lt;tex&amp;gt;alreadyWas + 1&amp;lt;/tex&amp;gt;. Среди цифр, которых еще нет в нашем префиксе, считаем, что это цифра &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-ом шаге:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{curFree}&amp;lt;/tex&amp;gt; {{---}} если элемент с номером &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; свободен, то он имеет номер curFree среди всех свободных элементов с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''function''' num2permutation(k: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                               &lt;br /&gt;
     alreadyWas = k div (n-i)!      &lt;br /&gt;
     k = k mod (n-i)!&lt;br /&gt;
     curFree = 0&lt;br /&gt;
     '''for''' j = 1 '''to''' n  &lt;br /&gt;
       '''if''' was[j] == false &lt;br /&gt;
         curFree++&lt;br /&gt;
         '''if''' curFree == alreadyWas + 1&lt;br /&gt;
           permutation[i] = j&lt;br /&gt;
           was[j] = true&lt;br /&gt;
   '''return''' permutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, так как в случае перестановок &amp;lt;tex&amp;gt;n=k&amp;lt;/tex&amp;gt;. Мы можем посчитать все &amp;lt;tex&amp;gt;n!&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;. Асимптотику можно улучшить &lt;br /&gt;
до &amp;lt;tex&amp;gt;O(n \log {n}) &amp;lt;/tex&amp;gt;, если использовать структуры данных (например, [[Декартово дерево|декартово дерево]] по неявному ключу), которые позволяют искать &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент множества и удалять элемент &lt;br /&gt;
множества за &amp;lt;tex&amp;gt;O( \log {n}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ого в лексикографическом порядке битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
При построении битовых векторов можно не проверять условие возможности постановки какого-то объекта на текущее место. На каждый позиции может стоять один из двух элементов, независимо от того, какие элементы находятся в префиксе. Так как у нас всего два возможных элемента, упростим второй цикл до условия: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[n]}&amp;lt;/tex&amp;gt; {{---}} искомый битовый вектор&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} номер искомого вектора среди всех битовых векторов&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{pow(2, n)}&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;2^{n}&amp;lt;/tex&amp;gt; количество битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''function''' num2bitvector(numOfBitvector: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' numOfBitvector &amp;gt;= pow(2, (n-i))&lt;br /&gt;
      numOfBitvector -= pow(2, (n-i))&lt;br /&gt;
      bitvector[i] = 1&lt;br /&gt;
    '''else'''&lt;br /&gt;
      bitvector[i] = 0    &lt;br /&gt;
   '''return''' bitvecor    &lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, так как в случае битовых векторов &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; не зависит от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. &lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение номера по объекту|Получение номера по объекту]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31 - ISBN 5-94774-010-9&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D1%83&amp;diff=42022</id>
		<title>Получение объекта по номеру</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D1%83&amp;diff=42022"/>
				<updated>2014-12-10T13:21:43Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Получаем элементы объекта по порядку: сначала определим какой элемент будет стоять на первом месте, потом на втором и так далее. Считаем, что мы нашли первые &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; элементов объекта. Для всех вариантов элемента, который может стоять на позиции с номером &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;, посчитаем диапазон номеров, который будет соответствовать объектам с данным префиксом. Если искомый номер входит в один из диапазонов, то, очевидно, мы нашли элемент, который должен стоять на месте с номером &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;. Диапазоны номеров не пересекаются, значит на это место больше нельзя поставить никакой другой элемент.&lt;br /&gt;
&lt;br /&gt;
*В начале каждого шага &amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} номер нужного объекта среди тех, у которых префикс до &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го элемента лексикографически равен префиксу нашего объекта. &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; {{---}} количество мест в комбинаторном объекте (например, битовый вектор длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{k}&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2&amp;lt;/tex&amp;gt;, поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.  Все элементы занумерованы в лексикографическом порядке, начиная с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Комбинаторные объекты занумерованы с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Переход к нумерации с единицы можно сделать с помощью одной операции декремента перед проходом алгоритма. &lt;br /&gt;
 '''function''' num2object(numOfObject: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                      &lt;br /&gt;
     '''for''' j = 1 '''to''' k '''do'''                      &lt;br /&gt;
       '''if''' j-ый элемент можно поставить на i-e место &lt;br /&gt;
         '''if''' numOfObject &amp;gt;= (количество комбинаторных объектов с префиксом object[1..i-1] и элементом j на месте i)&lt;br /&gt;
           numOfObject -= (количество комбинаторных объектов с префиксом object[1..i-1] и элементом j на месте i)&lt;br /&gt;
         '''else'''&lt;br /&gt;
           object[i] = j        &lt;br /&gt;
   '''return''' object&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. Стоит отметить, что подсчет количества комбинаторных объектов с заданным префиксом зачастую является задачей с достаточно большой вычислительной сложностью. &lt;br /&gt;
Приведем примеры получения некоторых [[Комбинаторные объекты|комбинаторных объектов]] по номеру.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ой в [[Лексикографический порядок|лексикографическом порядке]] перестановки размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Заметим, что всем префиксам на каждом шаге будет соответствовать диапазон номеров одинакового размера, (так как количество всевозможных суффиксов зависит только от длины) то есть можем просто посчитать &amp;quot;количество диапазонов, которые идут до нас&amp;quot; (количество цифр уже полностью занятых перестановками с меньшим номером) за &amp;lt;tex&amp;gt;O(1) &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*k {{---}} номер искомой последовательности&lt;br /&gt;
&lt;br /&gt;
*n! {{---}} количество перестановок размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*permutation[n] {{---}} искомая перестановка.&lt;br /&gt;
&lt;br /&gt;
*was[n] {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге:&lt;br /&gt;
&lt;br /&gt;
*alreadyWas {{---}} сколько цифр уже полностью заняты перестановками с меньшим номером.&lt;br /&gt;
&lt;br /&gt;
*мы должны поставить ту цифру, которая еще полностью не занята, то есть цифру с номером alreadyWas + 1. Среди цифр, которых еще нет в нашем префиксе, считаем, что это цифра j.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-ом шаге:&lt;br /&gt;
&lt;br /&gt;
*curFree {{---}} если элемент с номером &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; свободен, то он имеет номер curFree среди всех свободных элементов с 1 по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''function''' num2permutation(k: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                               &lt;br /&gt;
     alreadyWas = k div (n-i)!      &lt;br /&gt;
     k = k mod (n-i)!&lt;br /&gt;
     curFree = 0&lt;br /&gt;
     '''for''' j = 1 '''to''' n  &lt;br /&gt;
       '''if''' was[j] == false &lt;br /&gt;
         curFree++&lt;br /&gt;
         '''if''' curFree == alreadyWas + 1&lt;br /&gt;
           permutation[i] = j&lt;br /&gt;
           was[j] = true&lt;br /&gt;
   '''return''' permutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, так как в случае перестановок &amp;lt;tex&amp;gt;n=k&amp;lt;/tex&amp;gt;. Мы можем посчитать все n! за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;. Асимптотику можно улучшить &lt;br /&gt;
до &amp;lt;tex&amp;gt;O(n \log {n}) &amp;lt;/tex&amp;gt;, если использовать структуры данных (например, [[Декартово дерево|декартово дерево]] по неявному ключу), которые позволяют искать &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый элемент множества и удалять элемент &lt;br /&gt;
множества за &amp;lt;tex&amp;gt;O( \log {n}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ого в лексикографическом порядке битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
При построении битовых векторов можно не проверять условие возможности постановки какого-то объекта на текущее место. На каждый позиции может стоять один из двух элементов, независимо от того, какие элементы находятся в префиксе. Так как у нас всего два возможных элемента, упростим второй цикл до условия: &lt;br /&gt;
&lt;br /&gt;
*bitvector[n] {{---}} искомый битовый вектор&lt;br /&gt;
&lt;br /&gt;
*numOfBitvector {{---}} номер искомого вектора среди всех битовых векторов&lt;br /&gt;
&lt;br /&gt;
*pow(2, n) {{---}} &amp;lt;tex&amp;gt;2^{n}&amp;lt;/tex&amp;gt; количество битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''function''' num2bitvector(numOfBitvector: '''int''')&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' numOfBitvector &amp;gt;= pow(2, (n-i))&lt;br /&gt;
      numOfBitvector -= pow(2, (n-i))&lt;br /&gt;
      bitvector[i] = 1&lt;br /&gt;
    '''else'''&lt;br /&gt;
      bitvector[i] = 0    &lt;br /&gt;
   '''return''' bitvecor    &lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, так как в случае битовых векторов &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; не зависит от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. &lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение номера по объекту|Получение номера по объекту]]&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31 - ISBN 5-94774-010-9&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41889</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41889"/>
				<updated>2014-12-06T13:04:36Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;(i+1)&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из числовых представлений лексикографически упорядоченных элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n                   &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1          &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск элементов меньше рассматриваемого можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                                        &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += &amp;lt;tex&amp;gt;2^{n-i}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                        &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1              &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex dpi=140&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K                                       &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41888</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41888"/>
				<updated>2014-12-06T13:03:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из числовых представлений лексикографически упорядоченных элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n                   &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1          &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск элементов меньше рассматриваемого можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                                        &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += &amp;lt;tex&amp;gt;2^{n-i}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                        &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1              &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex dpi=140&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K                                       &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41887</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41887"/>
				<updated>2014-12-06T12:59:03Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Битовые вектора */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из числовых представлений лексикографически упорядоченных элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n                 &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1          &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск элементов меньше рассматриваемого можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                                        &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += &amp;lt;tex&amp;gt;2^{n-i}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                        &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1              &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex dpi=140&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K                                       &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41886</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41886"/>
				<updated>2014-12-06T12:50:51Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из числовых представлений лексикографически упорядоченных элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n                 &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1          &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск элементов меньше рассматриваемого можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                                        &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                        &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1              &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex dpi=140&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K                                       &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41884</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41884"/>
				<updated>2014-12-05T23:32:04Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                            &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = &amp;lt;tex&amp;gt;A_{min}&amp;lt;/tex&amp;gt; '''to''' предшествующий a[i] элемент '''do'''    &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {---} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск элементов меньше рассматриваемого можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += 2 &amp;lt;tex&amp;gt;\ll&amp;lt;/tex&amp;gt; n-i-1&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41883</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41883"/>
				<updated>2014-12-05T23:24:37Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                            &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = &amp;lt;tex&amp;gt;A_{min}&amp;lt;/tex&amp;gt; '''to''' предшествующий a[i] элемент '''do'''    &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {---} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += 2 &amp;lt;tex&amp;gt;\ll&amp;lt;/tex&amp;gt; n-i-1&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} \binom{n-i}{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} \binom{n-i}{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41882</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41882"/>
				<updated>2014-12-05T22:59:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                            &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = &amp;lt;tex&amp;gt;A_{min}&amp;lt;/tex&amp;gt; '''to''' предшествующий a[i] элемент '''do'''    &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {---} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} \binom{n-i}{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} \binom{n-i}{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41881</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41881"/>
				<updated>2014-12-05T22:23:40Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                            &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = &amp;lt;tex&amp;gt;A_{min}&amp;lt;/tex&amp;gt; '''to''' предшествующий элемент '''do'''    &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {---} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} \binom{n-i}{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} \binom{n-i}{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41880</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41880"/>
				<updated>2014-12-05T22:22:52Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                            &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = &amp;lt;tex&amp;gt;A_{min}&amp;lt;/tex&amp;gt; '''to''' предшествующий элемент '''do'''    &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {---} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} \binom{n-i}{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} \binom{n-i}{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// Нумерация сочетаний с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41879</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41879"/>
				<updated>2014-12-05T22:22:08Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                           &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = &amp;lt;tex&amp;gt;A_{min}&amp;lt;/tex&amp;gt; '''to''' предшествующий элемент '''do'''        &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {---} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} \binom{n-i}{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} \binom{n-i}{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// Нумерация сочетаний с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41878</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41878"/>
				<updated>2014-12-05T22:20:45Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = &amp;lt;tex&amp;gt;A_{min}&amp;lt;/tex&amp;gt; '''to''' предшествующий элемент '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {---} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} \binom{n-i}{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} \binom{n-i}{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// Нумерация сочетаний с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41877</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41877"/>
				<updated>2014-12-05T22:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = &amp;lt;tex&amp;gt;A_{min}&amp;lt;/tex&amp;gt; '''to''' предшествующий элемент '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {---} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {---} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} \binom{n-i}{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} \binom{n-i}{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// Нумерация сочетаний с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41876</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41876"/>
				<updated>2014-12-05T20:42:34Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Сочетания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; {{---}} (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == false                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = true                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;C_n^k&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} C_{n-i}^{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} C_{n-i}^{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfChoose&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания.&lt;br /&gt;
*&amp;lt;tex&amp;gt;choose[1..K]&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;choose[0] = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;C[n][k]&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;C[n][0] = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// Нумерация сочетаний с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
 '''int''' choose2num(choose: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера&amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41875</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41875"/>
				<updated>2014-12-05T20:29:22Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; {{---}} (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == false                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = true                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;C_n^k&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} C_{n-i}^{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} C_{n-i}^{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfChoose&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания.&lt;br /&gt;
*&amp;lt;tex&amp;gt;choose[1..K]&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;choose[0] = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;C[n][k]&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;C[n][0] = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// Нумерация сочетаний с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
 '''int''' choose2num(choose: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера&amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41874</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41874"/>
				<updated>2014-12-05T20:02:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; {{---}} (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == false                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = true                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex&amp;gt;C_n^k&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=1}^{val_1-1} C_{n-i}^{k-1}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex&amp;gt;$$\sum_{i=val_1+1}^{val_2-1} C_{n-i}^{k-2}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfChoose&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания.&lt;br /&gt;
*&amp;lt;tex&amp;gt;choose[1..K]&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;choose[0] = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;C[n][k]&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;C[n][0] = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// Нумерация сочетаний с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
 '''int''' choose2num(choose: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K '''do'''                                         &lt;br /&gt;
     '''for'''  i = choose[i - 1] + 1 '''to''' choose[i] - 1 '''do'''&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера&amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41791</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41791"/>
				<updated>2014-12-05T00:18:15Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые  могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == false                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = true                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41790</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41790"/>
				<updated>2014-12-05T00:07:58Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Битовые вектора */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые  могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == false                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = true                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41789</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41789"/>
				<updated>2014-12-05T00:04:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Перестановки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые  могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == false                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = true                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''function''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' bitvector[i] == 1  &lt;br /&gt;
         numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41788</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41788"/>
				<updated>2014-12-05T00:03:52Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''function''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые  могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == false                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = true                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''function''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' bitvector[i] == 1  &lt;br /&gt;
         numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41787</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41787"/>
				<updated>2014-12-05T00:03:19Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Перестановки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                       &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''function''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                     &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''           &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые  могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == false                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = true                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''function''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' bitvector[i] == 1  &lt;br /&gt;
         numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41786</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41786"/>
				<updated>2014-12-04T23:48:40Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                       &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               &amp;lt;font color=green&amp;gt;// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''function''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                       ''// n - количество элементов в перестановке''&lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''             ''// перебираем элемент, лексикографически меньший нашего, который  может стоять на i-м месте &lt;br /&gt;
       '''if''' was[j] == false                    ''// если элемент j ранее не был использован&lt;br /&gt;
         '''then''' numOfPermutation += P[n - i]   ''// все перестановки с префиксом длиной i-1 равным нашему, и i-й элемент у которых  &lt;br /&gt;
                                               ''меньше нашего в лексикографическом порядке, идут раньше данной перестановки               &lt;br /&gt;
     was[a[i]] = true                       ''// i-й элемент использован            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''function''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' bitvector[i] == 1  &lt;br /&gt;
         numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41785</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41785"/>
				<updated>2014-12-04T23:41:45Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        ''// перебираем элементы комбинаторного объекта''&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               ''// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого'' &lt;br /&gt;
       '''if''' элемент j можно поставить на i-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''function''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                       ''// n - количество элементов в перестановке''&lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''             ''// перебираем элемент, лексикографически меньший нашего, который  может стоять на i-м месте &lt;br /&gt;
       '''if''' was[j] == false                    ''// если элемент j ранее не был использован&lt;br /&gt;
         '''then''' numOfPermutation += P[n - i]   ''// все перестановки с префиксом длиной i-1 равным нашему, и i-й элемент у которых  &lt;br /&gt;
                                               ''меньше нашего в лексикографическом порядке, идут раньше данной перестановки               &lt;br /&gt;
     was[a[i]] = true                       ''// i-й элемент использован            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''function''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' bitvector[i] == 1  &lt;br /&gt;
         numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41783</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41783"/>
				<updated>2014-12-04T23:24:19Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Битовые вектора */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''function''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        ''// перебираем элементы комбинаторного объекта''&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               ''// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого'' &lt;br /&gt;
       '''if''' элемент j можно поставить на i-e место&lt;br /&gt;
         '''then''' numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''function''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                       ''// n - количество элементов в перестановке''&lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''             ''// перебираем элемент, лексикографически меньший нашего, который  может стоять на i-м месте &lt;br /&gt;
       '''if''' was[j] == false                    ''// если элемент j ранее не был использован&lt;br /&gt;
         '''then''' numOfPermutation += P[n - i]   ''// все перестановки с префиксом длиной i-1 равным нашему, и i-й элемент у которых  &lt;br /&gt;
                                               ''меньше нашего в лексикографическом порядке, идут раньше данной перестановки               &lt;br /&gt;
     was[a[i]] = true                       ''// i-й элемент использован            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfBitvector&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора.&lt;br /&gt;
*&amp;lt;tex&amp;gt;bitvector[1..n]&amp;lt;/tex&amp;gt; {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''function''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' bitvector[i] == 1  &lt;br /&gt;
         numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41782</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41782"/>
				<updated>2014-12-04T23:19:51Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Перестановки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''function''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        ''// перебираем элементы комбинаторного объекта''&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               ''// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого'' &lt;br /&gt;
       '''if''' элемент j можно поставить на i-e место&lt;br /&gt;
         '''then''' numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P[1..n]&amp;lt;/tex&amp;gt; {{---}}  количество перестановок данного размера.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}}  данная перестановка.&lt;br /&gt;
*&amp;lt;tex&amp;gt;was[1..n]&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''function''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                       ''// n - количество элементов в перестановке''&lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''             ''// перебираем элемент, лексикографически меньший нашего, который  может стоять на i-м месте &lt;br /&gt;
       '''if''' was[j] == false                    ''// если элемент j ранее не был использован&lt;br /&gt;
         '''then''' numOfPermutation += P[n - i]   ''// все перестановки с префиксом длиной i-1 равным нашему, и i-й элемент у которых  &lt;br /&gt;
                                               ''меньше нашего в лексикографическом порядке, идут раньше данной перестановки               &lt;br /&gt;
     was[a[i]] = true                       ''// i-й элемент использован            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*numOfBitvector {{---}} искомый номер вектора.&lt;br /&gt;
*bitvector[1..n] {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''function''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' bitvector[i] == 1  &lt;br /&gt;
         numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41781</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=41781"/>
				<updated>2014-12-04T23:17:34Z</updated>
		
		<summary type="html">&lt;p&gt;Dima32ml: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму&lt;br /&gt;
*&amp;lt;tex&amp;gt;numOfObject&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*&amp;lt;tex&amp;gt;a[1..n]&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; - (количество комбинаторных объектов с префиксом от 1 до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 '''function''' object2num(a: '''list &amp;lt;A&amp;gt;''') &lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                        ''// перебираем элементы комбинаторного объекта''&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1 '''do'''               ''// перебираем элементы, которые в лексикографическом порядке меньше  рассматриваемого'' &lt;br /&gt;
       '''if''' элемент j можно поставить на i-e место&lt;br /&gt;
         '''then''' numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*P[1..n] {{---}}  количество перестановок данного размера.&lt;br /&gt;
*a[1..n] {{---}}  данная перестановка.&lt;br /&gt;
*was[1..n] {{---}} использовали ли мы уже эту цифру в перестановке.&lt;br /&gt;
&lt;br /&gt;
 '''function''' permutation2num(a: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                       ''// n - количество элементов в перестановке''&lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1 '''do'''             ''// перебираем элемент, лексикографически меньший нашего, который  может стоять на i-м месте &lt;br /&gt;
       '''if''' was[j] == false                    ''// если элемент j ранее не был использован&lt;br /&gt;
         '''then''' numOfPermutation += P[n - i]   ''// все перестановки с префиксом длиной i-1 равным нашему, и i-й элемент у которых  &lt;br /&gt;
                                               ''меньше нашего в лексикографическом порядке, идут раньше данной перестановки               &lt;br /&gt;
     was[a[i]] = true                       ''// i-й элемент использован            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*numOfBitvector {{---}} искомый номер вектора.&lt;br /&gt;
*bitvector[1..n] {{---}} данный вектор.&lt;br /&gt;
&lt;br /&gt;
 '''function''' bitvector2num(bitvector: '''list &amp;lt;int&amp;gt;''')&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
    '''if''' bitvector[i] == 1  &lt;br /&gt;
         numOfBitvector += pow(2, n - i)&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
== Скобочные последовательности ==&lt;br /&gt;
*[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%BA%D0%BE%D0%B1%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8 Получение номера правильной скобочной последоватеьности]&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Dima32ml</name></author>	</entry>

	</feed>