Генерация всех перестановок, исключая циклические повороты

Поэтому мне нужен алгоритм для генерации всех перестановок списка чисел, исключая циклические повороты (например, [1,2,3] == [2, 3,1] == [3,1,2]).

Когда в последовательности есть хотя бы 1 уникальный номер, это довольно просто, выньте этот уникальный номер, сгенерируйте все перестановки оставшихся чисел (но с небольшой модификацией «стандартного» алгоритма перестановок) и добавьте уникальный номер на лицевой стороне.

Для генерации перестановок я обнаружил, что необходимо изменить код перестановок на:

def permutations(done, options)
    permuts = []
    seen = []
    for each o in options
        if o not in seen
            seen.add(o)
            permuts += permutations(done+o, options.remove(o))
    return permuts

Использование каждого уникального числа в параметрах только один раз означает, что вы не получите 322 дважды.

Этот алгоритм по-прежнему выводит вращения, когда нет уникальных элементов, например для [1,1,2,2] будет выведено [1,1,2,2], [1,2,2,1] и [1,2,1,2], а первые два являются циклическими поворотами.

Так есть ли эффективный алгоритм, который позволил бы мне сгенерировать все перестановки, не выполняя их впоследствии для удаления циклических поворотов?

Если нет, то какой способ убрать циклические повороты был бы наиболее эффективным?

ПРИМЕЧАНИЕ : это не с использованием Python, а скорее C ++.

6
задан Lightness Races with Monica 31 January 2012 в 21:18
поделиться