J'écris actuellement du code en C++ pour trouver toutes les permutations possibles de 6 entiers et stocker la meilleure permutation (c'est-à-dire celle dont le total est le plus proche d'une valeur donnée). J'essaie d'écrire ce code aussi efficacement que possible et j'apprécierais tout conseil ou exemple. Je pensais stocker les entiers dans un tableau et effectuer les permutations en utilisant des pointeurs dans une boucle. Est-ce une bonne approche?Aide au codage efficace
Répondre
Ils ont déjà pensé à celui-ci pour vous:
#include <algorithm>
int ra[6] = { 1, 2, 3, 4, 5, 6 };
do {
// whatever
} while (std::next_permutation(ra, ra+6));
Notez que les éléments doivent commencer dans l'ordre croissant (par comparaison par l'opérateur <), ou bien la boucle prendra fin avant d'avoir vu tous les permutation. Voir http://en.cppreference.com/w/cpp/algorithm/next_permutation pour plus de détails.
Cela ne donne probablement pas l'exécution la plus rapide possible, car à chaque étape, il doit examiner le tableau pour déterminer ce qu'il faut changer. Mais c'est certainement le plus efficace dans l'effort du programmeur, et sans connaître le compilateur et la plate-forme, il n'est vraiment pas possible d'optimiser au micro les approches de la boucle imbriquée de toute façon.
+1 Un joli. . – Tom
Jetez un oeil à cet excellent post @Coding the Wheel: Exhaustively Enumerating Combinations and Permutations in Code. Il a le code complet et a été écrit par un collègue SO'r, cela devrait suffire à vous mettre sur la bonne voie.
En supposant que les numéros dupliqués ne sont pas un problème, il y a n! des perumations de n entiers (pris n à la fois). Donc, peu importe ce que vous faites, votre algorithme va avoir un comportement temporel factoriel (O (n^n)). En d'autres termes, quand n devient grand, il sera lent. Pardon.
Il existe actuellement des algorithmes pour cela sur la page permutation wikipedia.
Heureusement n est 6, donc l'algorithme est O (720) ;-) –
I envisageait stocker les nombres entiers dans un tableau et effectuant les permutations utilisant des pointeurs dans une boucle . Est-ce une bonne approche?
Non, ce n'est pas vraiment une bonne approche. Au lieu d'échanger des pointeurs vers des éléments du tableau, il suffit d'inverser les éléments du tableau. Les pointeurs seraient juste une étape supplémentaire d'indirection sans aucun but réel.
- 1. Aide au refactoring LINQ requise
- 2. IE 6 Aide au débogage!
- 3. Gestion efficace des entrées au clavier
- 4. Aide pour vérifier si mon code de validation XML est efficace
- 5. windows Aide au script de connexion
- 6. MS Access - Aide au refactoring de requêtes
- 7. Aide au test de l'unité Grails requise
- 8. espaces de codage dans UITextView/UITextField au format URL
- 9. Quel codage utiliser pour l'exportation au format CSV?
- 10. efficace C# Conseils
- 11. getpos() codage
- 12. Chaîne Aide - Objectif C
- 13. Aide au téléchargement d'images vers l'instance EC2 (Flash -> PHP)
- 14. Ajouter les contrôles au panneau après FormView insérer aide
- 15. Aide au débogage - définir une valeur en mode débogage?
- 16. Aide au refactoring de code - comment réorganiser les validations
- 17. quel est le codage?
- 18. temps efficace Gameloop dans J2ME
- 19. Problème de codage sous Groovy
- 20. Utilisation efficace du schéma
- 21. Codage de fichier ASP.NET MVC
- 22. Pratique de codage: comment éviter le codage dur?
- 23. Style de codage Schéma Questions
- 24. efficace Django QuerySet regex
- 25. Créer son propre codage
- 26. Codage d'e-mail fiable
- 27. Codage de caractères confusion!
- 28. Description codage multiple
- 29. Utilisation d'un codage QString
- 30. Codage de table Hsqldb
Il y a beaucoup de questions concernant les permutations dans SO. S'il vous plaît chercher "permutations" et vous obtiendrez les réponses; peut-être qu'ils ne sont pas dans la même langue que vous codifiez (C++) ou la même structure (c'est-à-dire utilise des chaînes), mais vous serez capable de vous adapter. – Seb