kirill89
@kirill89

Как написать алгоритм поиска всех вариантов перестановок?

Дано:

- Массив чисел, длина массива заранее не известна, числа могут повторяться.
- Пример [1,2,6,1,3,1,1,1]

Задача:

- Сгенерировать все возможные перестановки этого массива.
- Комбинации не должны повторяться (для массива [1,2,1] это [2,1,1],[1,2,1],[1,1,2]).
- Решение должно быть оптимальным. Вариант с прямым перебором комбинаций элементов займет N! даже если в массиве есть повторяющиеся элементы.

Что уже пробовал:

- Рекурсивный алгоритм перебора сочетаний элементов массива (N!).
- Тот же алгоритм переписанный на хвостовую рекурсию (N!).
- Алгоритм тасования, там много времени расходуется что бы понять уникальная новая комбинация или нет.

Хотелось бы получить такой алгоритм, который на каждом следующем шаге, путем перестановки 2х или более элементов, будет выдавать новую уникальную комбинацию до тех пор, пока комбинации не кончатся и мы не получим исходную комбинацию.
  • Вопрос задан
  • 3272 просмотра
Пригласить эксперта
Ответы на вопрос 2
@MiiNiPaa
Перебираете все возможные перестановки в лексикографическом порядке, пока не наткнётесь на оригинальный массив.

https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D...
rain.ifmo.ru/cat/view.php/vis/combinations/permuta...

Пример кода на С++: coliru.stacked-crooked.com/a/5dfc5abd30ac003c
Пример реализации next_permutation: en.cppreference.com/w/cpp/algorithm/next_permutation
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы