Implémentation rapide et courte en C
#include <stdio.h>
void main(int argc, char *argv[]) {
const int n = 6; /* The size of the set; for {1, 2, 3, 4} it's 4 */
const int p = 4; /* The size of the subsets; for {1, 2}, {1, 3}, ... it's 2 */
int comb[40] = {0}; /* comb[i] is the index of the i-th element in the combination */
int i = 0;
for (int j = 0; j <= n; j++) comb[j] = 0;
while (i >= 0) {
if (comb[i] < n + i - p + 1) {
comb[i]++;
if (i == p - 1) { for (int j = 0; j < p; j++) printf("%d ", comb[j]); printf("\n"); }
else { comb[++i] = comb[i - 1]; }
} else i--; }
}
Pour voir à quel point il est rapide, utilisez ce code et testez-le
#include <time.h>
#include <stdio.h>
void main(int argc, char *argv[]) {
const int n = 32; /* The size of the set; for {1, 2, 3, 4} it's 4 */
const int p = 16; /* The size of the subsets; for {1, 2}, {1, 3}, ... it's 2 */
int comb[40] = {0}; /* comb[i] is the index of the i-th element in the combination */
int c = 0; int i = 0;
for (int j = 0; j <= n; j++) comb[j] = 0;
while (i >= 0) {
if (comb[i] < n + i - p + 1) {
comb[i]++;
/* if (i == p - 1) { for (int j = 0; j < p; j++) printf("%d ", comb[j]); printf("\n"); } */
if (i == p - 1) c++;
else { comb[++i] = comb[i - 1]; }
} else i--; }
printf("%d!%d == %d combination(s) in %15.3f second(s)\n ", p, n, c, clock()/1000.0);
}
test avec cmd.exe (Windows) :
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
c:\Program Files\lcc\projects>combination
16!32 == 601080390 combination(s) in 5.781 second(s)
c:\Program Files\lcc\projects>
Passez une bonne journée.
4 votes
Une préférence pour un langage de programmation ?
9 votes
Comment voulez-vous traiter les lettres en double ?
0 votes
Pas de préférence de langage, je vais le coder en ruby mais une idée générale des algorithmes à utiliser serait bien. Deux lettres de même valeur peuvent exister mais pas la même lettre deux fois.
0 votes
Solution flash as3 stackoverflow.com/questions/4576313/
0 votes
En php, ce qui suit devrait faire l'affaire : stackoverflow.com/questions/4279722/
0 votes
Un peu de ma sagesse Le programme mentionné dans le lien peut être étendu pour résoudre tout problème de nature exponentielle. Voici la structure de base. chamanchindi.blogspot.in/2008/10/
0 votes
Abacus (sur github) une bibliothèque de combinatoire pour Node.JS, Python, PHP, Actionscript (ps je suis l'auteur)
0 votes
@wcm Je n'ai pas trouvé de solution ici pour traiter les lettres en double. Je suis allé de l'avant et j'ai répondu à la question nécessitant les doublons (et nécessitant du C++) : stackoverflow.com/q/29967202/2642059
0 votes
Il y a un bon article convaincant avec ce qui semble être une implémentation efficace en C# ici : msdn.microsoft.com/fr/us/library/aa289166(v=vs.71).aspx