Algorithme pour la liste de tous unique de permutations des nombres contenir des doublons
Le problème est le suivant: étant Donné un ensemble de chiffres qui pourraient contenir des doublons, le retour de tous unique de permutations.
Le naïf façon est d'utiliser un ensemble (en C++) pour contenir les permutations. Cela prend O(n! × log(n!)) temps. Est-il la meilleure solution?
Puisqu'il y a
Oui, je suis en train d'essayer de réduire le temps de la complexité à O(n!).
Sons devoirs-ey.
1.
Je crois que le point de l'exercice est de mettre en œuvre
n!
permutations de n
distincts entiers, vous ne pouvez pas faire mieux que O(n!)
si vous êtes tenu de les énumérer. Notez également que la présence de doublons est pas pertinent étant donné que le processus de suppression de doublons prend une quantité négligeable de temps par rapport à l'énumération des permutations.Oui, je suis en train d'essayer de réduire le temps de la complexité à O(n!).
Sons devoirs-ey.
1.
next_permutation
(en C++ STL) visites chaque permutation exactement une fois, même quand il y a des doublons. 2. L'espace exigence seul est O(nn!), pas de O(n!). 3. En insérant l'ensemble des n! les permutations dans un STL jeu de prendre en O(n! log(n!)) = O(nn!*logn)Je crois que le point de l'exercice est de mettre en œuvre
next_permutation
. Aussi, je devrait peut-être se sont qualifiés dont je parlais du temps de la complexité seule, et je voudrais juste de les stocker dans une liste (puisque la prochaine perm algo déjà exclut les doublons).OriginalL'auteur stackunderflow | 2012-07-11
Vous devez vous connecter pour publier un commentaire.
L'approche la plus simple est la suivante:
O(n lg n)
O(n! * <complexity of finding next permutaion>)
L'étape 3 peut être accompli par la définition de la prochaine permutation que celui qui apparaît directement après la permutation si la liste des permutations de tri, par exemple:
La recherche de la prochaine permutation lexicographique est O(n), et de la simple description est donnée sur la page de Wikipedia pour la permutation de sous la rubrique Génération dans l'ordre lexicographique.
Si vous vous sentez ambitieux, vous pouvez générer le prochain permutation en O(1) à l'aide de plaine les changements
Le next_permutation est le point. Et il n'y a pas de devoirs en été:)
Là où j'habite, c'est l'hiver. 🙂 J'ai ajouté quelques liens à la prochaine perm algorithmes, si vous rencontrez des difficultés particulières, je serai heureux de vous aider, mais sinon je ne vois pas le mérite de me retaper les algorithmes d'ici.
La complexité de la "régulière"
next_permutation
algorithme est O(1) amorti sur toutes les permutations. Donc, si vous êtes en visite à toutes les permutations, ce qui est optimal.Il semble que vous êtes correct. Je ne le savais pas, merci!
OriginalL'auteur verdesmarald
1) variation sur un retour en arrière/recherche récursive sera généralement résoudre ce genre de problème. Étant donné une fonction pour renvoyer une liste de toutes les permutations sur (n-1) objets, de générer une liste de toutes les permutations de n objets de la façon suivante: pour chaque élément dans la liste insérer le nième objet dans toutes les positions possibles, de la vérification de doublons. Ce n'est pas particulièrement efficace, mais il génère souvent une simple code pour ce genre de problème.
2) Voir Wikipedia à http://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
3) les Universitaires ont passé beaucoup de temps sur les détails de cette. Voir la section 7.2.1.2 de Knuth Vol 4A - c'est un grand livre relié avec la brève suivante table des matières sur Amazon:
Chapitre 7: Combinatoire De La Recherche 1
7.1: les Zéros et les uns 47
7.2: Générer Toutes Les Possibilités 281
OriginalL'auteur mcdowella
Vous devriez lire mon blog sur ce genre de permutation (entre autres choses) pour obtenir plus d'arrière-plan - et suivez les liens.
Ici est une version de mon Lexicographique permutations générateur constitué d'après la génération de la séquence de Steinhaus–Johnson–Trotter permutation des générateurs, comme demandé:
La sortie à partir du programme ci-dessus est la suivante par exemple:
OriginalL'auteur Paddy3118
Ce un j'ai inventé après avoir réfléchi à la façon dont j'ai écrit les permutations par la main et de mettre de la méthode dans le code est plus court et mieux:
Notes
incv
incrémente le vecteur de permutation pour trouver tous. Il a également gère correctement répétez les lettres.test
imprime toutes les permutations et leur nombre pour la chaîne de test. Il s'assure également que si vous demandez lexicographique de la commande que le tri avant et tri après les méthodes sont les mêmes. Cela devrait être Vrai depuis que la chaîne d'origine est ordonné et l'incrément de permutation fonction transforme la chaîne dans la prochaine lexicographique de la chaîne par l'alphabet.Ce script peut être exécuté à partir de l'invite de commande par:
python script.py [test_string] [optional anything to use lexicographic ordering]
OriginalL'auteur Cris
J'avais légèrement améliorée Paddy3118 de la solution, donc il est maintenant non-récursive, lazy-évalué (complètement basé sur les générateurs) et plus rapide d'environ 30%.
P. S. j'ai remarqué Paddy3118 avait fait sa mise en œuvre utilisation de générateurs ainsi, alors que j'ai travaillé sur la mise en œuvre dans le billet de blog, qui est plus de mémoire intensitive. Je suis ce détachement de toute façon, cette version pourrait être considéré comme plus propre.
OriginalL'auteur toriningen
Une version récursive. Ce calcule n!/(m*k!) (m nombre de jeux de caractères, k nombre de caractères répétés dans chaque set:
Espère que cette aide
OriginalL'auteur Fooo