29
 правок
Изменения
→Описание алгоритма
== Описание алгоритма ==
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с <tex>0</tex>). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины <tex>i</tex> совпадает, а <tex>i+1</tex> элемент лексикографически меньше <tex>i+1</tex>-го в данном объекте (<tex>i = 0..n-1</tex>). 
Следующий алгоритм вычисляет эту сумму
*<tex>numOfObject </tex> {{---}} искомый номер комбинаторного объекта.*<tex>a[1..n] </tex> {{---}} данный комбинаторный обьект, состоящий из элементов множества <tex>A</tex>.*<tex>d[i][j] </tex> - (количество комбинаторных объектов с префиксом от 1 до <tex>i-1</tex> равным данному и с <tex>i</tex>-м элементом равным <tex>j</tex>)
 '''function''' object2num(a: '''list <A>''') 
         '''then''' numOfObject += d[i][j]
   '''return''' numOfObject
Сложность алгоритма {{---}} <tex>O(nk) </tex>, где <tex>k</tex> - количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора <tex>k=2,</tex> поскольку возможны только <tex>0 </tex> и <tex>1</tex>. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. 
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.