algorithme pour la génération de nombre de combinaisons sans répétition
J'ai vérifié presque chaque poste similaire ici, mais je ne pouvais pas comprendre comment je peux faire ce que je veux. Ce que j'essaie d'en donner une entrée dans un programme C, disons nombre de 4, et le programme de retour de la suite des nombres dans un tableau:
1
2
3
4
12
13
14
23
24
34
123
134
124
1234
Pour être plus clair:
Si le nombre d'entrée est 4 alors je veux utiliser les chiffres de 1 à 4 et de générer toutes les combinaisons possibles de chiffres(de 1 chiffres combinaisons à 4 chiffres combinaisons) sans chiffre de répétitions.
J'ai essayé le code suivant:
#include <stdio.h>
/* Prints out a combination like {1, 2} */
void printc(int comb[], int k) {
printf("{");
int i;
for (i = 0; i < k; ++i)
printf("%d, ", comb[i] + 1);
printf("\\b\\b}\\n");
}
int next_comb(int comb[], int k, int n) {
int i = k - 1;
++comb[i];
while ((i >= 0) && (comb[i] >= n - k + 1 + i)) {
--i;
++comb[i];
}
if (comb[0] > n - k) /* Combination (n-k, n-k+1, ..., n) reached */
return 0; /* No more combinations can be generated */
/* comb now looks like (..., x, n, n, n, ..., n).
Turn it into (..., x, x + 1, x + 2, ...) */
for (i = i + 1; i < k; ++i)
comb[i] = comb[i - 1] + 1;
return 1;
}
int main(int argc, char *argv[]) {
int n = 5; /* The size of the set; for {1, 2, 3, 4} it's 4 */
int k = 3; /* The size of the subsets; for {1, 2}, {1, 3}, ... it's 2 */
int comb[16]; /* comb[i] is the index of the i-th element in the
combination */
/* Setup comb for the initial combination */
int i;
for (i = 0; i < k; ++i)
comb[i] = i;
/* Print the first combination */
printc(comb, k);
/* Generate and print all the other combinations */
while (next_comb(comb, k, n))
printc(comb, k);
return 0;
}
Le programme ci-dessus imprime le résultat. Je veux obtenir le résultat en quelque sorte.. mais je ne peux pas parce que le code ci-dessus imprime le résultat d'une étrange manière.
Vous tentez d'afficher une sorte de permutation de l'entrée d'origine? Votre question n'est pas très claire.
Je fixe la sortie et j'ai ajouté une meilleure explication
Ah, si vous essayez de modifier le programme que vous avez trouvé sur compprog.wordpress.com/2007/10/17/generating-combinations-1 pour mettre le résultat dans un tableau au lieu de la sortie standard stdout?
C'est le droit.Et c'est parce que j'ai essayé tout ce que je pouvais penser..
OriginalL'auteur Dchris | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
Nous utilisons un int pour représenter un ensemble. Pour le i-ème bit, si elle est de 1, alors i est dans le jeu et vice-versa.
Prendre un exemple:1010(2)={4,2} 1111(2)={4,3,2,1}
Pour chaque élément qui sera pris en considération, il y a deux choix: ou pas dans le jeu.
Donc, il y a 2^n différentes au total. Et dans mon code, je viens d'énumérer tous les possibles int qui correspond à un ensemble, et de sortie de l'ensemble correspondant.
Afin d'obtenir ce code:
lorsque n=4, sortie:
Si vous voulez à la sortie de la réponse que l'ordre du don, il suffit de leur faire de chaîne et de mettre ces derniers chaîne dans le vecteur et le tri.
Si n est grand, vous pouvez utiliser bitset. Mais quand on n>le 30,il ne peut pas être résilié en heures. Donc int est efficace.
(sizeof(int)*8)-2
, et vous pourriez serrer un peu plus si vous avez utiliséunsigned int
. Si de plus grandes tailles ont besoin d'un tableau d'octets avec une boucle supplémentaire pourrait facilement être incorporés. Dans l'ensemble, une belle réponse.Je pense que l'ajout d'une description dans la partie supérieure de ce que l'algorithme fonctionne, ce serait bien. Cet algorithme génère l' (non ordonnée) des ensembles et les représente avec un ensemble de bits. Donc
{1, 2, 3, 4} = 1111
et{} = 0000
et{1, 3} = 1010
, etc. Il passe par tous les ensembles de bits et génère l'ensemble correspondant des nombres en vérifiant si ce bit est à "on" (c'est à dire== 1
) et l'imprime si c'est le cas. Ah je viens de remarquer qu'il n'a pas l'impression de l'ensemble vide, mais qui peut ou peut ne pas être souhaitable.Ah, j'ai foiré la commande. C'est plus comme
{4, 3, 2, 1} = 1111
(au lieu de{1, 2, 3, 4} = 1111
)- Je mettre à jour ma réponse. Merci pour vous conseils.
OriginalL'auteur Sayakiss
Ici est un programme qui génère des combinaisons de nombres. Il est écrit en C.
Mais il pourrait être réécrit dans une autre langue. Pour maintenant, il suffit de le compiler et de l'essayer !
exécuter pour n=4 :
OriginalL'auteur Mustapha Oldache