Изменения

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

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

13 байт убрано, 01:16, 9 ноября 2011
Нет описания правки
''k {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте (элемент лексикографически меньше другого, если номер элемента меньше номера другого) (например для битового вектора k=2 : возможны только 0 и 1)''
'''for''' i = 1 '''to''' n '''do''' '''for''' j = 1 '''to''' k '''do''' '''if''' элемент j можно поставить на i-e место '''then if''' numOfObject > (количество комбинаторных обектов с данным префиксом)''' '''then''' numOfObject -= (количество комбинаторных обектов с данным префиксом) '''else''' '''then''' ans[i]=j перейти к выбору следующего элемента
Несложно понять, что корректность алгоритма следует из его построения.
Сложность алгоритма <tex>O(nkf(1..i)) </tex>, где <tex>f(1..i)</tex> - сложность вычисления количества комбинаторных объектов с данным префиксом. Основную сложность при построении алгоритмов генерации комбинаторных объектов составляет вычисление количества комбинаторных объектов с данным префиксом. Приведем примеры способов получения некоторых из [[Комбинаторные объекты|комбинаторных объектов]] по номеру.
''мы должны поставить ту цифру, которая еще полностью не занята, т.е. alreadyWas+1 - ую, которой еще нет в нашем префиксе, пусть это цифра j''
'''for''' i = 1 '''to''' n '''do''' alreadyWas = (numOfPermutation-1) div <tex>P_{n-i} </tex> numOfPermutation = ((numOfPermutation-1) mod <tex>P_{n-i} </tex>) + 1 ans[i] = j (посчитаем за <tex>O(n) </tex>) теперь j-ый элемент занят (находится в нашем префиксе)
Данный алгоритм работает за <tex>O(n^2) </tex> (n=k). Мы можем посчитать все <tex>P_{n} </tex> за <tex>O(n) </tex>. Асимптотику можно улучшить
Анонимный участник

Навигация