<?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=217.66.157.54&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=217.66.157.54&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/217.66.157.54"/>
		<updated>2026-04-17T01:15:18Z</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=33371</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=33371"/>
				<updated>2013-11-02T10:58:34Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.157.54: /* Перестановки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с 0). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &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;
*numOfObject {{---}} искомый номер комбинаторного объекта.&lt;br /&gt;
*a[1..n] {{---}} данный комбинаторный обьект.&lt;br /&gt;
*d[i][j] - (количество комбинаторных объектов с префиксом от 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;
  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;
Сложность алгоритма {{---}} &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;: возможны только 0 и 1. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &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;
  '''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[i] = true                       ''// элемент i использован            &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;n&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов, независимо от того, какие элементы находятся в префиксе, поэтому поиск меньших элементов можно упростить до условия: &lt;br /&gt;
*numOfBitvector {{---}} искомый номер вектора.&lt;br /&gt;
*bitvector[1..n] {{---}} данный вектор.&lt;br /&gt;
 '''for''' i = 1 '''to''' n '''do'''                                         &lt;br /&gt;
  '''if''' bitvector[i] == 1  '''{'''&lt;br /&gt;
     numOfBitvector += 2 ^ (n - i)        &lt;br /&gt;
  '''}'''&lt;br /&gt;
&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>217.66.157.54</name></author>	</entry>

	</feed>