У меня есть c++ vector
с std::pair<unsigned long, unsigned long>
объектами. Я пытаюсь генерировать перестановки объектов вектора с помощью std::next_permutation()
. Однако, я хочу, чтобы перестановки имели заданный размер, вы знаете, аналогично permutations
функции в python, где указан размер ожидаемой возвращаемой перестановки.
В основном, c++
эквивалент
import itertools
list = [1,2,3,4,5,6,7]
for permutation in itertools.permutations(list, 3):
print(permutation)
(1, 2, 3)
(1, 2, 4)
(1, 2, 5)
(1, 2, 6)
(1, 2, 7)
(1, 3, 2)
(1, 3, 4)
..
(7, 5, 4)
(7, 5, 6)
(7, 6, 1)
(7, 6, 2)
(7, 6, 3)
(7, 6, 4)
(7, 6, 5)
python
c++
permutation
d4rk4ng31
источник
источник
(1, 1)
? Перестановки Python обеспечивают дублирование[(1, 1), (1, 1)]
, в то время какstd::next_permutation
избежать дубликатов (только{1, 1}
).Ответы:
Вы можете использовать 2 цикла:
демонстрация
источник
std::next_permutation
«неясна», так как считается свопом (линейным). Извлечение субвектора можно улучшить, но я не думаю, что это изменит сложность. Кроме того, число перестановок зависит от размера вектора, поэтому 2 параметра не являются независимыми.std::vector<T>& v
?v
настоящее время). Я мог бы пройти по константной ссылке и вместо этого создать отсортированную копию в теле.Если эффективность не является главной задачей, мы можем перебрать все перестановки и пропустить те, которые отличаются суффиксом, выбирая только каждую из
(N - k)!
них. Например, дляN = 4, k = 2
, у нас есть перестановки:где я вставил пробел для ясности и пометил каждую
(N-k)! = 2! = 2
перестановку с помощью<
.Вывод:
источник
Вот эффективный алгоритм, который не использует
std::next_permutation
напрямую, но использует рабочие концы этой функции. То естьstd::swap
иstd::reverse
. Как плюс, это в лексикографическом порядке .И называя это мы имеем:
Вот вывод:
Вот исполняемый код от Ideone
источник
bool nextPartialPermutation(It begin, It mid, It end)
Превратив ответ Джозефа Вуда с помощью интерфейса итератора, вы можете использовать метод, подобный следующему
std::next_permutation
:демонстрация
источник
Это мое решение после некоторой мысли
Пожалуйста, прокомментируйте свои мысли
источник
permute
на самом деле может быть толькоset.insert(vec);
удаление большого фактора.O(nb_total_perm * log(nb_res))
(nb_total_perm
что в основномfactorial(job_list.size())
иnb_res
размер результата :)permutations.size()
, так что все еще слишком велик. (но теперь вы обрабатываете ввод дубликатов вопреки Evg)