Comments 31
Также, в рамках этой задачи видно, что в исходном множестве элементы могут повторяться (в примере повторяется 0). Соответственно, тождественные строки, вызванные перестановкой одинаковых элементов, не должны повторяться на выходе. Потому на выходе алгоритма может быть меньше чем n! элементов.
Разве тут перемножением сложностей. Вы находите суффикс за n и потом делаете сортировку. Получается n + log(n)
Можно бороться только за уменьшение сложности получения следующей перестановки. Гуглить по словам DFS и DP. Все делается гораздо и быстрее проще чем у вас.
DFS это поиск в графу, я что-то не совсем понимаю, как он может подойти в данном случае.
Граф или дерево это просто самый простой пример.
Я посмотрю, но мне кажется это не совсем тот случай.
дано 1234
результаты
1
21 12
321 231 213
4321 3421 3241 3214
Типичный же случай.
По большому счету это алгоритм перестановок. Мне кажется в этом контексте он бесполезный. Да, я могу построить граф, что замете n! времени, а потом поиском по графу найти найти нужную перестановку, что ещё займёт О (m + n). Я не говорю, что его нельзя использовать, просто это не эффективно.
Что касается практического применения алгоритма, то за все время моей работы он мне ни разу не понадобился, но на интервью в Uber посчитали иначе :))
В Убер-то взяли? Вы забыли добавить в конце статьи:
Обсуждение статьи не будет полным без ссылки на std::next_permutation
. Хотя лично я никогда не понимал, что эта функция вообще делает в стандартной библиотеке С++.
проверить алгоритм можно тут leetcode.com/problems/next-permutation
за решение спасибо, я его не знал
сперли они значит эти задачи (назывался тест что-то типа Задачи от Алисы), а тестовый код не смогли — на С# закоммитил (естественно, свои решения с leetcode), тесты упали с ошибкой компиляции тестового окружения :) не ожидал такого от Uber
Потом пришел менеджер и расспрашивал меня, как бы я улучшил их приложение. Это был не Uber, на что я высказал несколько идей, он сказал, что они это уже реализовали. К чему это было — для меня не совсем понятно.
Думаю, Нараяна снова где-то воскрес, так как его алгоритм замучили
В книге Д. Кнута "Искусство программирования. Том 4, выпуск 2. Генерация всех кортежей и перестановок" обсуждается также алгоритм P, в котором все перестановки перебираются путём замены пары смежных элементов на каждом шаге. Я когда-то давно нашёл алгоритм для этого с пом. подсчёта числа беспорядков, но алгоритм P работает быстрее, тем более он быстрее, чем лексикографический метод. Он использует два вспомогательных массива такого же размера, как и массив с перестановкой, а я обошёлся без доп. массивов. В книге Окулова "Программирование в алгоритмах" также есть алгоритм P.
Недавно я нашёл алгоритм получения перестановки по её номеру в соответствии с алгоритмом P, такого алгоритма я нигде пока не видел. Написать, что ли, статейку об этом? Скажут: маловато материала...
Также у Кнута поставлена задача генерации перестановок быстрейшим путём на совр. процессорах, эта задача остаётся открытой.
Алгоритм: Как найти следующую лексикографическую перестановку