<?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=178.62.238.64&amp;*</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=178.62.238.64&amp;*"/>
		<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/178.62.238.64"/>
		<updated>2026-04-18T20:26:54Z</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%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=53438</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=53438"/>
				<updated>2016-04-25T18:41:04Z</updated>
		
		<summary type="html">&lt;p&gt;178.62.238.64: Variable &amp;quot;i&amp;quot; already defined&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'''  j = 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>178.62.238.64</name></author>	</entry>

	</feed>