Поэтому мне нужен алгоритм для генерации всех перестановок списка чисел, кроме циклических вращений (например, [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 ++.