Rechercher : dans
Par :

Algo affichage combinaison de p elemt parmi n

Dernière réponse le 30 jun 2009 à 13:17:13 brah, le 7 jan 2008 à 12:06:16 
 Signaler ce message aux modérateurs

Bonjour,
je cherche un algo ou code (c# ou c++) dont le but est d'afficher toutes les combinaisons possible de p element d'un tableau d'entiers de n
elements exemple :
j'ai un tableau de 3 element int[] tab = {1,2,3} et que je veux les combinaisons de 2 elements.
resultats
12
12
23

je veux un algo generique pour un tableau de n entier, et le nombre d'element des combinaisons est p (C(n,p))
merci

Configuration: Windows XP
Firefox 2.0.0.11

Meilleures réponses pour « Algo affichage combinaison de p elemt parmi n » dans :
Afficher les extensions et les fichiers cachés sous Windows VoirPour afficher les extensions Solution simple Solution avec le registre Pour afficher les fichiers et les dossiers cachés Pour afficher les fichiers et les dossiers système Pourquoi afficher les extensions ? Lorsque vous ne voyez...
[PHP] Comment afficher l'adresse IP d'un visiteur ? VoirPour afficher l'adresse IP d'un visiteur sur votre site, insérez ce code dans la zone où vous voulez qu'elle s'affiche.
[Windows] Afficher la loupe VoirWindows XP et Vista possèdent une option très utile et peu connue permettant d'afficher une loupe. Cette fonctionnalité peut notamment être très pratique lors de présentations. Pour activer simplement la loupe, il suffit de suivre l'une des...
L'affichage de données sur le navigateur avec les CGI VoirBut d'un script CGI Les scripts CGI ont pour but d'afficher des pages Web générées par un programme informatique, d'où la dénomination de pages web dynamiques pour les pages créées par ce moyen. Toutefois, étant donné que le serveur renvoie telles...

1

brah, le 7 jan 2008 à 12:24:10

Oups je me suis trompé
les combinaisons de 1.2.3 avec p=2 sont :
12
13
23

Répondre à brah

2

Ravageur, le 6 fév 2008 à 16:44:25

Bonjour brah,

Est-ce que tu as trouvé un algorithme? Je recherche la même chose que toi par exemple si on a les boules 2,5,7
Faire une combinaison sans arrangement, sans répéition
2;5
2;7
5;7
Je recherche aussi un ensemble possible de 22 numéros et d'en faire sortir seulement 4 chiffres
Pas numéroté de 1 à 22.

Comme tu le mentionnes un semble de P éléments et en faire sortir n parmi les P et non de 1 à 49 ou 1 à 70
Merci!

Répondre à Ravageur

3

proto, le 21 jun 2008 à 13:55:50

Bonjour,

je ne sais pas si vous attendez toujours une réponse mais j'ai une proposition de solution basée sur l'emploi d'un algorithme récursif codée en langage c.

Bonne journée.

Répondre à proto

4

syl20, le 19 oct 2008 à 10:00:51

Bonjour à tous je me suis à mon tour, penché sur cette question et je suis tombé sur ce post.
J'ai donc pris mon mal en patiente et tenté d'en faire un moi même. ce code est en Action script 2.0 (langage de flash) mais je pense que la syntaxe est proche du C à la déclaration de quelques variables près. j'ai tenté de commenter le code et je demeure ouvert à toute suggestion/optimisation:

//pour connaitre le nombre de combinaisons possibles
function c(k,n){
tot=1;
for(r=n;r>k;r--){tot*=r;}
for(r=(n-k);r>1;r--){tot/=r;}
return(tot);
}

//la fonction suivante retourne un tableau de longueur c(k,n),ou k représente la longueur du tableau passé en //paramètre, contenant pour chaque indice un tableau contenant n elements constituant une combinaison unique


function combi(arr_in,n){

//initialisation du tableau detiné à recevoir une combinaison par indice
//pour les languages n'autorisant pas la création de tableaux de longueur dynamique: //C(k,n)=n!/(k!(n-k)!),cf:fonction donnée plus haut
comb=[];

fini=false;
//initialisation d'un tableau de longueur n destiné à recevoir les n indices du tableau d'entrée reçu en paramètre //constituant un élément de la combinaison en cours
id=Array(n);
//affectation de valeurs croissantes -1 pour le dernier indice
for(cptid=0;cptid<n;cptid++){id[cptid]=cptid;}
id[n-1]=id[n-1]-1;

//l'algorithme avec k fixé prendrait l'allure de k boucles for imbriquées
//j'ai ici simulé un tel comportement par l'utilisation d'une boucle parcourant k avec une structure conditionnelle //testant le non dépassement des indices:
//incrémentation si non dépassement,changement de dimension de la boucle dans la clause else

while(!fini){
exit=false;
for(i=n-1;i>=0 && !exit;i--){
if(id[i]<arr_in.length-n+i){
id[i]++;
exit=true;
}else{
fini=(i==0);
first=true;
for(cpt=(n-i);cpt>0;cpt--){
id[n-cpt]=id[(n-1)-cpt]+((first)?2:1);
first=false;
}
}
}
if(!fini){
//construction du tableau contenant la combinaison en cours
arr_aux=Array(n);
for(cptid=0;cptid<n;cptid++){arr_aux[cptid]=arr_in[id[cptid]];}

//ajout de cette combinaison au tableau en contenant l'intégralité
comb.push(arr_aux);
}
}
return comb;
}

//test de la fonction
trace("["+combi(["A","B","C","D","E","F","G"],5).join("]"+chr(13)+"[")+"]");


voilà ceci fonctionne aussi avec un tableau d'entiers, ou même d'objets
attention, je n'ai pas mis de gestion d'erreur dans le cas ou le tableau serait plus petit que k, sous flash cela retourne un tableau vide, mais génèrera sans doute des erreurs dans un langage tel que C

Répondre à syl20

5

Alexandre, le 28 déc 2008 à 01:28:40

Salut,

Pourrais-tu m'expliquer ton code en pseudocode car je ne connais pas du tout Action script. Je connais C, C++ et Java. Merci.

Répondre à Alexandre

7

hugo, le 30 jun 2009 à 10:13:34

Bonjour,

j'essaye de transcrire le code Action Script en C.
mais je suis bloqué sur " ((first)?2:1); ", pouvez vousme dire ce à quoi ca correspond en C, si vous savez bien sur?

Merci d'avance

Hugo

Répondre à hugo

8

 zapaterox, le 30 jun 2009 à 13:17:13

Malheureusement je ne sais pas ce que veut dire ce code en C

Répondre à zapaterox

6

Ogulrok, le 20 jan 2009 à 04:33:12

Je ne sais pas si tu as trouvé ta solution mais j'ai fais un petit algo qui fait ca...
J'ai posté un petit résumé sur mon site : http://www.ogulrok.com/...
Comme je dis dans mon "résumé", c'est pas l'algo du siècle mais bon ca fait la job (et c'est du C#)...
J'espère que ca t'aidera...

Répondre à Ogulrok