J'ai un c++ vector
avec des std::pair<unsigned long, unsigned long>
objets. J'essaie de générer des permutations des objets du vecteur en utilisantstd::next_permutation()
. Cependant, je veux que les permutations soient d'une taille donnée, vous savez, similaire à la permutations
fonction en python où la taille de la permutation retournée attendue est spécifiée.
Fondamentalement, l' c++
équivalent de
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
la source
la source
(1, 1)
? permutations python fournit dupliqué[(1, 1), (1, 1)]
, tandis questd::next_permutation
évitez les doublons (uniquement{1, 1}
).Réponses:
Vous pouvez utiliser 2 boucles:
Démo
la source
std::next_permutation
"n'est pas claire" car elle compte le swap (linéaire). L'extraction du sous-vecteur peut être améliorée, mais je ne pense pas que cela change la complexité. De plus, le nombre de permutations dépend de la taille du vecteur, donc les 2 paramètres ne sont pas indépendants.std::vector<T>& v
?v
actuellement). Je pourrais passer par référence const et créer une copie triée dans le corps à la place.Si l'efficacité n'est pas la principale préoccupation, nous pouvons parcourir toutes les permutations et ignorer celles qui diffèrent sur un suffixe ne sélectionnant que chaque
(N - k)!
-ième. Par exemple, pourN = 4, k = 2
, nous avons des permutations:où j'ai inséré un espace pour plus de clarté et marqué chaque
(N-k)! = 2! = 2
permutation -nd avec<
.Production:
la source
Voici un algorithme efficace qui n'utilise pas
std::next_permutation
directement, mais utilise les chevaux de travail de cette fonction. C'est,std::swap
etstd::reverse
. En plus, c'est dans l' ordre lexicographique .Et en l'appelant, nous avons:
Voici la sortie:
Voici le code exécutable de exécutable ideone
la source
bool nextPartialPermutation(It begin, It mid, It end)
En tournant Joseph Wood avec l'interface de l'itérateur, vous pourriez avoir une méthode similaire à
std::next_permutation
:Démo
la source
Ceci est ma solution après réflexion
Veuillez commenter vos pensées
la source
permute
ne pouvait en fait queset.insert(vec);
supprimer un grand facteur.O(nb_total_perm * log(nb_res))
(nb_total_perm
ce qui est surtoutfactorial(job_list.size())
et lanb_res
taille du résultatpermutations.size()
:), donc toujours trop gros. (mais maintenant vous gérez les doublons contrairement à Evg)