Eu tenho um c++ vector
com std::pair<unsigned long, unsigned long>
objetos. Estou tentando gerar permutações dos objetos do vetor usando std::next_permutation()
. No entanto, eu quero que as permutações sejam de um determinado tamanho, você sabe, semelhante à permutations
função em python em que o tamanho da permutação retornada esperada é especificado.
Basicamente, o c++
equivalente a
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
fonte
fonte
(1, 1)
? permutações python fornecem duplicado[(1, 1), (1, 1)]
, enquantostd::next_permutation
evitam duplicados (apenas{1, 1}
).Respostas:
Você pode usar 2 loops:
Demo
fonte
std::next_permutation
é "pouco clara", pois conta a troca (Linear). A extração do sub-vetor pode ser melhorada, mas não acho que isso mude a complexidade. Além disso, o número de permutações depende do tamanho do vetor; portanto, o parâmetro 2 não é independente.std::vector<T>& v
?v
atualmente classifico ). Eu poderia passar por referência const e criar uma cópia classificada no corpo.Se a eficiência não for a principal preocupação, podemos iterar todas as permutações e pular aquelas que diferem em um sufixo, selecionando apenas cada
(N - k)!
uma delas. Por exemplo, paraN = 4, k = 2
, temos permutações:onde inseri um espaço para maior clareza e marquei cada
(N-k)! = 2! = 2
permutação com<
.Resultado:
fonte
Aqui está um algoritmo eficiente que não usa
std::next_permutation
diretamente, mas utiliza os cavalos de trabalho dessa função. Isto é,std::swap
estd::reverse
. Como um plus, está em ordem lexicográfica .E chamando, temos:
Aqui está a saída:
Aqui está o código executável do ideone
fonte
bool nextPartialPermutation(It begin, It mid, It end)
Para responder a Joseph Wood com a interface do iterador, você pode ter um método semelhante a
std::next_permutation
:Demo
fonte
Esta é a minha solução depois de pensar um pouco
Por favor, comente seus pensamentos
fonte
permute
de fato, apenasset.insert(vec);
remover um grande fator.O(nb_total_perm * log(nb_res))
(nb_total_perm
que é principalmentefactorial(job_list.size())
enb_res
tamanho do resultadopermutations.size()
:), portanto, ainda é muito grande. (mas agora você lida com entradas duplicadas contrárias ao Evg)