Я работал над этим часами, но не мог понять.
Определите степень перестановки как минимальное количество транспозиций, которые необходимо создать для ее создания. Таким образом, степень (0, 1, 2, 3)
равна 0, степень (0, 1, 3, 2)
равна 1, степень (1, 0, 3, 2)
равна 2 и т.д.
Посмотрите на пространство Snd
как пространство всех перестановок последовательности длины n
, имеющих степень d
.
Я хочу два алгоритма. Тот, который принимает перестановку в этом пространстве и присваивает ему номер индекса, а другой, который принимает номер индекса элемента в Snd
и извлекает его перестановку. Номера индексов должны, очевидно, быть последовательными (т.е. В диапазоне 0 to len(Snd)-1
, причем каждая перестановка имеет отдельный индексный номер.)
Я хотел бы, чтобы это реализовано в O(sane)
; это означает, что если вы запрашиваете номер перестановки 17, алгоритм не должен перебирать все перестановки между 0 и 16 для получения вашей перестановки.
Есть идеи, как это решить?
(Если вы собираетесь включить код, я предпочитаю Python, спасибо.)
Update:
Мне нужно решение, в котором
- Перестановки упорядочены в соответствии с их лексикографическим порядком (а не вручную их упорядочиванием, а эффективным алгоритмом, который дает их с лексикографическим порядком для начала) и
- Я хочу, чтобы алгоритм принимал последовательность разной степени, поэтому я мог сказать: "Я хочу, чтобы число перестановок 78 из всех перестановок степеней 1, 3 или 4 из пространства перестановок диапазона (5)". (В основном функция принимает набор степеней.) Это также повлияет на обратную функцию, которая вычисляет индекс из перестановки; основанный на множестве степеней, индекс будет отличаться.
Я пробовал решить это в течение последних двух дней, и мне не удалось. Если бы вы могли предоставить код Python, это было бы лучше.