Изменения

Перейти к: навигация, поиск

Получение номера по объекту

12 байт добавлено, 19:18, 4 сентября 2022
м
rollbackEdits.php mass rollback
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера <tex>n</tex>,
*<tex>\mathtt{a[1..n]}</tex> {{---}} данная перестановка,
*<tex>\mathtt{P[1..(n]- i)!}</tex> {{---}} количество перестановок данного размера<tex>(n - i)</tex>,
*<tex>\mathtt{was[1..n]}</tex> {{---}} использовали ли мы уже эту цифру в перестановке,
'''for''' j = 1 '''to''' a[i] - 1 <font color=green>// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на <tex>i</tex>-м месте</font>
'''if''' was[j] == ''false'' <font color=green>// если элемент <tex>j</tex> ранее не был использован</font>
numOfPermutation += P[(n - i] )! <font color=green>// все перестановки с префиксом длиной <tex>i-1</tex> равным нашему, и <tex>i</tex>-й элемент у которых</font>
<font color=green>меньше нашего в лексикографическом порядке, идут раньше данной перестановки</font>
was[a[i]] = ''true'' <font color=green>// <tex>i</tex>-й элемент использован</font>
== Сочетания ==
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из <tex>n</tex> по <tex>k</tex>. Как известно, количество сочетаний из <tex>n</tex> по <tex>k</tex> обозначается как <tex dpi=140>\binom{n}{k}</tex>. Тогда число сочетаний, в которых на позиции <tex>1</tex> стоит значение <tex>val_1</tex>, равно <tex dpi=140>$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$</tex>; число сочетаний, в которых на позиции <tex>2</tex> стоит значение <tex>val_2</tex>, равно <tex dpi=140>$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$</tex>. Аналогично продолжаем по следующим позициям:
*<tex>\mathtt{numOfChoose}</tex> {{---}} искомый номер сочетания,
*<tex>\mathtt{C[n][k]}</tex> {{---}} количество сочетаний из <tex>n</tex> по <tex>k</tex>, <tex>\mathtt{C[n][0] = 1}</tex>,
== Разбиение на слагаемые ==
Рассмотрим алгоритм получения номера , в лексикографическом порядке данного разбиения , по данному разбиению на слагаемые числа <tex>N</tex>. Нужно помнить о том, что разбиения, отличающиеся только порядком слагаемых, считаются одинаковыми. Из всех разбиений, получаемых перестановками слагаемых, выберем то, где слагаемые упорядочены лексикографически, и будем строить его.
*<tex>\mathtt{numOfPart}</tex> {{---}} искомый номер разбиения
'''int''' part2num(part: '''list<int>'''):
numOfPart = 0, last = 0, sum = 0
'''for''' i = 1 '''to''' part.size
'''for''' j = last '''to''' part[i] - 1 <font color=green>// перебираем все элементы, лексикографически меньшие нашеготекущего, но большие или равные не меньшие предыдущего</font>
numOfPart += d[N - sum - j][j] <font color=green>// прибавляем количество перестановок, которые могли начинаться с <tex>j</tex></font>
sum += part[i] <font color=green>// увеличиваем уже поставленную сумму</font>
1632
правки

Навигация