Построение перестановок перебором
Построение перестановок перебором — это способ получить все возможные порядки элементов: на каждом шаге выбирают ещё не использованный элемент, а после завершения ветви возвращаются назад и пробуют следующий вариант. Такой перебор является применением бэктрекинга.
Как работает алгоритм
Частично построенная последовательность хранится в текущем состоянии. Если её длина равна \(n\), получена готовая перестановка, и её выводят. Иначе перебирают все элементы, которые ещё не были выбраны: добавляют один из них, отмечают использованным, углубляются в рекурсию, а затем отменяют выбор. Возврат нужен, чтобы тот же элемент можно было использовать в другой ветви.
Число получаемых перестановок \(n!\). На первом шаге возможны \(n\) выбора, на втором — \(n-1\), затем \(n-2\) и так далее. Порядок, в котором рассматриваются кандидаты, задаёт порядок перебора вариантов, но не меняет количество результатов.
Сначала выбираем A. Затем возможны B и C: получаются ветви ABC и ACB. После возврата к первому шагу выбираем B и получаем BAC и BCA, затем C — CAB и CBA. Итого \(3!=6\) перестановок.
generate(prefix, used): if length(prefix) == n: print(prefix) return for each element x: if x is not used: mark x as used generate(prefix + x, used) unmark x
В перестановках важен порядок: ABC и BAC — разные результаты. В сочетаниях порядок выбранных элементов не учитывается. Также возврат не означает удаление уже выведенного результата: отменяется только текущий выбор перед переходом к соседней ветви.
Сколько перестановок получится для четырёх различных элементов?
Главное
- Алгоритм строит последовательность слева направо, выбирая неиспользованный элемент.
- После завершения ветви выбор отменяется, и перебор продолжается с другим вариантом.
- Для \(n\) различных элементов число перестановок равно \(n!\); тема является частным случаем построения перестановок.