Quelqu'un peut-il expliquer un bon algorithme pour trouver toutes les permutations d'un ensemble donné de nombres d'une manière efficace?Permutations d'un ensemble de nombres donné
Répondre
Avez-vous regardé Knuth 'The Art of Computer Programming'? Le volume 3, Tri et Recherche le couvre, ce qui est logique car un tri crée une permutation particulière des données. Méfiez-vous des algorithmes combinatoires (et permutationnels) qui trouvent toutes les combinaisons ou permutations. Ils ont des coûts de notation Big-O très élevés.
Les approches les plus simples sont les méthodes récursives, c'est-à-dire, dans un pseudocode exécutable;
def permute(theseq):
if len(theseq) <= 1:
yield theseq
return
for i in range(len(theseq)):
theseq[0], theseq[i] = theseq[i], theseq[0]
for subperm in permute(theseq[1:]):
yield theseq[:1] + subperm
theseq[0], theseq[i] = theseq[i], theseq[0]
au cas où vous n'êtes pas familier avec executable pseudocode, les notations [1:]
et [:1]
sont destinés à désigner (« tout sauf le premier » respecively et « juste le premier ») « tranches », et les deux missions identiques effectue les tâches suivantes: "échanger les 0e et 1e articles" et "les remettre en place" (c'est-à-dire les échanger de nouveau ;-). yield
signifie "fournir ce résultat mais être prêt à continuer quand itéré sur", tandis que return
signifie "nous avons tous terminé, bye bye!".
Il existe des approches un peu meilleures sur différents axes de performance, mais la première étape consiste à s'assurer que vous êtes totalement familier avec l'approche récursive fondamentale et que vous la comprenez bien - donc je m'arrête ici pour l'instant. Si et quand vous ne comprenez pleinement cette approche, pourquoi il bien et woks dandy, et comment et pourquoi il ne semble pas vraiment optimale de la performance, je serai heureux de développer cette réponse -)
Mon C# mise en œuvre du pseudocode Alex:
private int length;
private List<List<string>> permutations;
public List<List<string>> Generate(List<string> list)
{
length = list.Count;
permutations = new List<List<string>>();
foreach(List<string> subperms in Recursive(list))
permutations.Add(subperms);
return permutations;
}
private List<List<string>> Recursive(List<string> list)
{
List<List<string>> subperms = new List<List<string>>();
if (list.Count <= 1)
{
subperms.Add(list);
return subperms;
}
for (int i = 0; i < list.Count; i++)
{
string temp = list[0];
list[0] = list[i];
list[i] = temp;
List<string> tail = new List<string>(list);
tail.RemoveAt(0);
List<string> head = new List<string>();
head.Add(list[0]);
foreach (List<string> subperm in Recursive(tail))
{
List<string> headCopy = new List<string>(head);
headCopy.AddRange(subperm);
if (headCopy.Count == length)
permutations.Add(headCopy);
else
subperms.Add(headCopy);
}
temp = list[0];
list[0] = list[i];
list[i] = temp;
}
return subperms;
}
- 1. Code pour générer des permutations pour un ensemble donné de nombres efficacement C#
- 2. Python obtenir toutes les permutations de nombres
- 3. Énumération d'un ensemble de permutations basées sur une condition
- 4. Comment générer toutes les permutations d'une liste de nombres?
- 5. Enumération des permutations d'un ensemble de sous-ensembles
- 6. permutations de BST
- 7. PHP forçant un ensemble de nombres spécifiques
- 8. Essayer toutes les permutations
- 9. C++ m bits de permutations d'un nombre
- 10. Choisir N nombres aléatoires d'un ensemble
- 11. Permutations de taille variable
- 12. Permutations avec restrictions supplémentaires
- 13. Permutations en python 2.5.2
- 14. Sélection de produits vendus à un ensemble donné de clients
- 15. Quelle est la meilleure approche pour trouver si un ensemble donné est un sous-ensemble parfait d'un ensemble - Si un sous-ensemble donné n'est pas trié?
- 16. Un ensemble donné d'éléments de groupe est-il un ensemble de représentants de coset?
- 17. donné une liste de jusqu'à 10 nombres entiers et une somme, affichera un sous-ensemble des nombres dont le total est cette somme
- 18. Permutations F #
- 19. php importance d'un nombre dans un ensemble de nombres
- 20. Permutations en python, avec une torsion
- 21. Requête SQL - Permutations de chaîne
- 22. ensemble donné est 00:00:00 en PHP/MySQL
- 23. Numériser des nombres au sein d'un sous-ensemble
- 24. Comment afficher ensemble des chaînes et des nombres dans MATLAB?
- 25. Récursivité et permutations
- 26. permutations allées mal
- 27. C#: 0 & 1 permutations
- 28. permutations en C++
- 29. Permutations ML standard
- 30. permutations et combinaisons
double possible de [code afin de générer pour un ensemble Permutations donné de nombres efficacement C#] (http://stackoverflow.com/questions/1634880/code-to-generate -permutations-pour-un-donné-ensemble-de-nombres-efficacement-c) – mafu
Je suppose qu'il est préférable de garder celui-ci. – mafu