permutation

permutation - Algo - Programmation

Marsh Posté le 02-12-2011 à 14:33:55    

salut les filles  
je cherche un algo (recursif ?) qui prend un tableau ("A" "B" "C" etc) en parametre et qui renvoie tout les tableau possible avec les permutations des elements du tableau  
 
merci
 


---------------
marilou repose sous la neige
Reply

Marsh Posté le 02-12-2011 à 14:33:55   

Reply

Marsh Posté le 02-12-2011 à 14:40:36    

Où est la difficulté ?
 
Si on fait les devoirs à la place des étudiants, ils n'apprennent pas, et ce n'est pas bon pour eux.
Ce ne serait pas non plus équitable pour ses camarades.
Et enfin, ça inciterait le prof à faire des exercices de plus en plus compliqués.
 
Franchement, un algorithme récursif de permutation, c'est assez facile à écrire.

Reply

Marsh Posté le 02-12-2011 à 14:42:18    

je sais pas quel age tu as mais mois je suis plus a l'école  
:sleep:


---------------
marilou repose sous la neige
Reply

Marsh Posté le 02-12-2011 à 14:45:27    

Alors, c'est encore pire que ce que je croyais.
 
Il faudrait retourner à l'école (en commençant par le CE1 où l'on apprend à mettre une majuscule au début de chaque phrase).


Message édité par olivthill le 02-12-2011 à 14:45:43
Reply

Marsh Posté le 02-12-2011 à 14:58:05    

A l'école, il sont tout de même doué pour demander des idée aux autres...  :ange:

Reply

Marsh Posté le 02-12-2011 à 15:18:16    

Tu peux pas prendre l'algo que gilou a donné comme solution pour les chaîne de caractères ?
Au lieu de mettre des caractère tu mets les élément de ton tableau.
C'est pas la même chose ?
Si t'as deux éléments identique t'aura des doublon par contre.

Reply

Marsh Posté le 02-12-2011 à 18:46:09    

Si tu t'autorises le récursivité, alors en 2 coup de cuillère à pot, je te ponds celui la, que tu peux adapter à tes besoins:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void swap(char *symbols, unsigned int i, unsigned int j) {
  4.     char tmp = symbols[i];
  5.     symbols[i] = symbols[j];
  6.     symbols[j] = tmp;
  7. }
  8. void permute(char *symbols, unsigned int i, unsigned int size) {
  9.     if (i < size) {
  10. unsigned int j;
  11. for (j = i; j <size; j++) {
  12.     swap(symbols, i, j);
  13.     permute(symbols, i+1, size);
  14.     swap(symbols, j, i);
  15. }
  16. return;
  17.     }
  18.     printf("%s\n", symbols);
  19. }
  20. int main() {
  21.     char symbols[] = "01234";
  22.     unsigned int size = strlen(symbols);
  23.     permute(symbols, 0, size);
  24.     return 0;
  25. }


 
Après, tu n'as plus qu'a adapter à tes besoins:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void swap(char* table[], unsigned int i, unsigned int j) {
  4.     char *tmp = table[i];
  5.     table[i] = table[j];
  6.     table[j] = tmp;
  7. }
  8. void permute(char *table[], unsigned int i, unsigned int size) {
  9.     if (i < size) {
  10. unsigned int j;
  11. for (j = i; j <size; j++) {
  12.     swap(table, i, j);
  13.     permute(table, i+1, size);
  14.     swap(table, j, i);
  15. }
  16. return;
  17.     }
  18.     int k;
  19.     for (k = 0; k < size; k++) {
  20. printf("%s ", table[k]);
  21.     }
  22.     printf("\n" );
  23. }
  24. int main() {
  25.     char* table[] = {"vapeur", "cochonne", "a dit", "l'alcool c'est mal!"};
  26.     unsigned tabsize = 4;
  27.     permute(table, 0, tabsize);
  28.     return 0;
  29. }


 

C:\clang>vapeur.exe
vapeur cochonne a dit l'alcool c'est mal!
vapeur cochonne l'alcool c'est mal! a dit
vapeur a dit cochonne l'alcool c'est mal!
vapeur a dit l'alcool c'est mal! cochonne
vapeur l'alcool c'est mal! a dit cochonne
vapeur l'alcool c'est mal! cochonne a dit
cochonne vapeur a dit l'alcool c'est mal!
cochonne vapeur l'alcool c'est mal! a dit
cochonne a dit vapeur l'alcool c'est mal!
cochonne a dit l'alcool c'est mal! vapeur
cochonne l'alcool c'est mal! a dit vapeur
cochonne l'alcool c'est mal! vapeur a dit
a dit cochonne vapeur l'alcool c'est mal!
a dit cochonne l'alcool c'est mal! vapeur
a dit vapeur cochonne l'alcool c'est mal!
a dit vapeur l'alcool c'est mal! cochonne
a dit l'alcool c'est mal! vapeur cochonne
a dit l'alcool c'est mal! cochonne vapeur
l'alcool c'est mal! cochonne a dit vapeur
l'alcool c'est mal! cochonne vapeur a dit
l'alcool c'est mal! a dit cochonne vapeur
l'alcool c'est mal! a dit vapeur cochonne
l'alcool c'est mal! vapeur a dit cochonne
l'alcool c'est mal! vapeur cochonne a dit


 
A+,


Message édité par gilou le 02-12-2011 à 18:57:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-12-2011 à 20:56:17    

merci gilou !
 
je vais le simplifier pour du pseudo code
 
pdt que tu es la avec jovalise
mon pb est le suivant
 
faire un itinéraire optimisé avec n étape
 
mon idée c'"était  
1 - generer tout les trajets (je sais calculer les temps entre 2 villes)
2 calculer le temps d'un trajet
3 sortir le min du tableau de trajet
 
y'a plus simple ?  
 
c'est juste un exo /amusement en formation mais je trouve ça marant
en pseudo code on a le droit aux * méthodes magique* comme celle qui génere le tableau de trajet
 
 


---------------
marilou repose sous la neige
Reply

Marsh Posté le 02-12-2011 à 21:07:30    

Ce dont tu parles équivaut au problème classique du voyageur de commerce, non?
On peut toujours faire une approche combinatoire, mais des qu'on a beaucoup de ville, ça explose en temps de calcul.
Le problème du voyageur de commerce se solutionne avec des temps de calcul raisonnables en se contentant d'une bonne solution (même si c'est pas nécessairement la meilleure). Cf le lien Wikipedia donné.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-12-2011 à 21:10:41    

Citation :

je vais le simplifier pour du pseudo code


L'algo est très simple:
J'échange pas swap le premier élément avec un quelconque des autres (dont lui même pour avoirs les cas ou il est stable), puis je réapplique récursivement au reste moins ce premier élément (la boucle initiale sert a faire l'échange du premier élément avec chacun des éléments possibles).
A+,

Message cité 1 fois
Message édité par gilou le 02-12-2011 à 21:13:14

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-12-2011 à 21:10:41   

Reply

Marsh Posté le 02-12-2011 à 21:20:03    

gilou a écrit :

Ce dont tu parles équivaut au problème classique du voyageur de commerce, non?
A+,


 :jap:


---------------
marilou repose sous la neige
Reply

Marsh Posté le 02-12-2011 à 21:20:53    

gilou a écrit :

Citation :

je vais le simplifier pour du pseudo code


L'algo est très simple:
J'échange pas swap le premier élément avec un quelconque des autres (dont lui même pour avoirs les cas ou il est stable), puis je réapplique récursivement au reste moins ce premier élément (la boucle initiale sert a faire l'échange du premier élément avec chacun des éléments possibles).
A+,


 :jap:


---------------
marilou repose sous la neige
Reply

Marsh Posté le 02-12-2011 à 21:24:54    

c'est marrant je croyais que les possibilité de voyage c'était en n^n mais c'est plutot en n! non ?


---------------
marilou repose sous la neige
Reply

Marsh Posté le 02-12-2011 à 21:32:17    

vapeur_cochonne a écrit :

c'est marrant je croyais que les possibilité de voyage c'était en n^n mais c'est plutot en n! non ?

Si tu as n villes, c'est n! le nombre de permutations des villes.
Notes que dans ce cas, il y a des trajets équivalents (a vue de nez, le trajet dans un sens ou l'autre déjà, donc ça réduit déjà à n!/2)
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-12-2011 à 21:35:52    

gilou a écrit :

Si tu as n villes, c'est n! le nombre de permutations des villes.
Notes que dans ce cas, il y a des trajets équivalents (a vue de nez, le trajet dans un sens ou l'autre déjà, donc ça réduit déjà à n!/2)
A+,
 


:non: amiens -> paris <> paris amiens :o²


---------------
marilou repose sous la neige
Reply

Marsh Posté le 02-12-2011 à 21:39:42    

vapeur_cochonne a écrit :


:non: amiens -> paris <> paris amiens :o²

C'est la même distance Il suffit donc de faire le trajet en marche arrière [:kede:2]  
A+,

Message cité 1 fois
Message édité par gilou le 02-12-2011 à 21:41:26

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-12-2011 à 21:41:58    

gilou a écrit :

C'est la même distance :D
A+,


pas le meme temps voyons bouchons toussa :o²

Citation :

 

Donald Knuth fut un des premiers à l'appliquer systématiquement dès les premiers volumes de sa série The Art of Computer Programming. Il complétait cette analyse de considérations propres à la théorie de l'information : celle-ci par exemple, combinée à la formule de Stirling, montre que, dans le pire cas, il n'est pas possible d'effectuer, sur un ordinateur classique, un tri général (c'est-à-dire uniquement par comparaisons) de N éléments en un temps croissant avec N moins rapidement que N ln N.


a ouais


Message édité par vapeur_cochonne le 02-12-2011 à 21:42:21

---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 14:49:14    

:???:
 
j'essaie de l'implementer en java  
et c'est bizard, mon swat mache ^pas sans le tableau en parametre
si je met 2 string  
 
public void swat(String x, String y){
 
alors que public void swap(String tab[], int x, int y){
fonctionne


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 15:01:35    

Citation :

public void swat(String x, String y){

Comme méthode d'une classe tableau?
Ah non, j'ai pas trop compris ce que les String viennent faire la dedans.
A+,


Message édité par gilou le 05-12-2011 à 15:02:40

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2011 à 15:01:57    

non


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 15:04:30    

Ben alors c'est quoi String x et String y  (parce que en java, les strings étant pas modifiables une fois construites...)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2011 à 15:05:44    

bah c'est t[i]; t[j]


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 17:14:45    

Chez moi, ça marche... [:chacal_one333]  
 

Code :
  1. import java.util.Arrays;
  2.  
  3. public class Cochonne {
  4.    private String[] table;
  5.  
  6.    public Cochonne (String[] t)  {
  7.     table = t;
  8.    }
  9.  
  10.    private void swap(int i, int j) {
  11.     String tmp = table[i];
  12.     table[i] = table[j];
  13.     table[j] = tmp;
  14.    }
  15.  
  16.    private void permute(int i) {
  17.     if (i < table.length) {
  18.         for (int j = i; j < table.length; j++) {
  19.         swap(i, j);
  20.         permute(i+1);
  21.         swap(j, i);
  22.         }
  23.         return;
  24.     }
  25.     System.out.println(Arrays.toString(table));
  26.    }
  27.  
  28.    public void permute() {
  29.     permute(0);
  30.    }
  31.  
  32.    public static void main(String[] args){
  33.     Cochonne vapeur = new Cochonne(new String[] {"vapeur", "cochonne", "a dit", "l'alcool c'est mal!"});
  34.     vapeur.permute();
  35.    }
  36. }


C:\Java>javac Cochonne.java
 
C:\Java>java Cochonne
[vapeur, cochonne, a dit, l'alcool c'est mal!]
[vapeur, cochonne, l'alcool c'est mal!, a dit]
[vapeur, a dit, cochonne, l'alcool c'est mal!]
[vapeur, a dit, l'alcool c'est mal!, cochonne]
[vapeur, l'alcool c'est mal!, a dit, cochonne]
[vapeur, l'alcool c'est mal!, cochonne, a dit]
[cochonne, vapeur, a dit, l'alcool c'est mal!]
[cochonne, vapeur, l'alcool c'est mal!, a dit]
[cochonne, a dit, vapeur, l'alcool c'est mal!]
[cochonne, a dit, l'alcool c'est mal!, vapeur]
[cochonne, l'alcool c'est mal!, a dit, vapeur]
[cochonne, l'alcool c'est mal!, vapeur, a dit]
[a dit, cochonne, vapeur, l'alcool c'est mal!]
[a dit, cochonne, l'alcool c'est mal!, vapeur]
[a dit, vapeur, cochonne, l'alcool c'est mal!]
[a dit, vapeur, l'alcool c'est mal!, cochonne]
[a dit, l'alcool c'est mal!, vapeur, cochonne]
[a dit, l'alcool c'est mal!, cochonne, vapeur]
[l'alcool c'est mal!, cochonne, a dit, vapeur]
[l'alcool c'est mal!, cochonne, vapeur, a dit]
[l'alcool c'est mal!, a dit, cochonne, vapeur]
[l'alcool c'est mal!, a dit, vapeur, cochonne]
[l'alcool c'est mal!, vapeur, a dit, cochonne]
[l'alcool c'est mal!, vapeur, cochonne, a dit]


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2011 à 17:15:50    

gilou a écrit :

Chez moi, ça marche... [:chacal_one333]

 

[code=javapeur, cochonne, a dit][/fixed]
A+,


non mais j'avais pas de return ...

 

sinon comment on peux ranger les resultats dans un tableau ? :o


Message édité par vapeur_cochonne le 05-12-2011 à 17:17:14

---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 17:29:30    

Dans ce cas la, plusieurs possibilités:
Soit tu utilises un tableau que tu fais croître au fur et a mesure, un ArrayList.
Soit tu alloues un tableau de table.length! au début de permute
Il faut changer la signature de permute (pour qu'elle renvoie ton tableau des permutations) et celle de permute(int i) pour qu'elle prenne le tableau des permutations en paramètre.
Et tu ajoute chaque nouvelle permutation au niveau de la ligne
System.out.println(Arrays.toString(table));
en copiant (une vraie copie avec clone, bien sur) table à ce moment la.
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2011 à 17:33:46    

ok :jap:


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 17:51:49    

Bon, la, un exemple vite fait, en foutant tout en statique dans la classe, pour aller plus vite:

Code :
  1. import java.util.Arrays;
  2. public class Cochonne {
  3.     private String[] table;
  4.     private String[][] permuteList;
  5.     int ind;
  6.    
  7.     public Cochonne (String[] t)  {
  8. table = t;
  9. permuteList = new String[factorial(t.length)][];
  10. ind = 0;
  11.     }
  12.     private void swap(int i, int j) {
  13. String tmp = table[i];
  14. table[i] = table[j];
  15. table[j] = tmp;
  16.     }
  17.     private void permute(int i) {
  18. if (i < table.length) {
  19.     for (int j = i; j < table.length; j++) {
  20.  swap(i, j);
  21.  permute(i+1);
  22.  swap(j, i);
  23.     }
  24.     return;
  25. }
  26. // System.out.println(Arrays.toString(table));
  27. permuteList[ind] = table.clone();
  28. ind++;
  29.     }
  30.     public String[][] permute() {
  31. ind = 0;
  32. permute(0);
  33. return permuteList;
  34.     }
  35.     private static int factorial(int n) {
  36.         int ret = 1;
  37.         for (int i = 1; i <= n; ++i) ret *= i;
  38.         return ret;
  39.     }
  40.     public static void main(String[] args){
  41. Cochonne vapeur = new Cochonne(new String[] {"vapeur", "cochonne", "a dit", "l'alcool c'est mal!"});
  42. String[][] permuted = vapeur.permute();
  43. for (int i = 0; i < permuted.length; i++) {
  44.     System.out.println(Arrays.toString(permuted[i]));
  45. }
  46.     }
  47. }


Notes que bien sur, dès que l'on a un tableau initial un peu grand, factorielle va nous exploser dans la tronche :whistle:  
Faudrait donc en tenir compte, par exemple, en allant lire ceci: http://chaosinmotion.com/blog/?p=622
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2011 à 18:07:11    

cool :o²


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 18:10:29    

:fou: tout en anglais, galere


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 18:14:44    

Le forum n'est pas là pour faire vos exercices à votre place :o


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 05-12-2011 à 18:16:38    

tait toi vilain


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 18:53:23    

:D
Je vais faire une alerte modo, tiens, si ça se trouve, gilou va passer par là et locker ce topic :o


Message édité par el muchacho le 05-12-2011 à 18:53:37

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 05-12-2011 à 18:54:36    

3 Mois que je suis a paris et tu m'as jamais payé une biere :o gilou non plus d'ailleurs !


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 19:04:49    

Ça ne sera envisageable que quand ma situation financière évoluera positivement. La je dois faire vraiment gaffe à mon budget.
Ça semble se débloquer pour début janvier heureusement.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2011 à 19:09:31    

vapeur_cochonne a écrit :

:fou: tout en anglais, galere

De toute façon, si tu es coincé par le fait que ta factorielle dépasse maxint, vu que tu auras besoin de cela fois la taille de ton array initial a allouer en mémoire pour le String[][], c'est la mémoire qui manquera, même si on utilise une classe adaptée pour que factorielle soit sans problème.
C'est pour ça que le pb de la qualité de l'implem de factorielle m'a pas trop inquiété :D
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2011 à 19:09:33    

gilou a écrit :

Ça ne sera envisageable que quand ma situation financière évoluera positivement. La je dois faire vraiment gaffe à mon budget.
Ça semble se débloquer pour début janvier heureusement.
A+,


comme si je pouvais pas te payer une biere [:kikiv] ou pire, mutch [:kikiv]²
 
sinon revend une ou deux caisse de dvd :o


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 19:10:56    

gilou a écrit :

De toute façon, si tu es coincé par le fait que ta factorielle dépasse maxint, vu que tu auras besoin de cela fois la taille de ton array initial a allouer en mémoire pour le String[][], c'est la mémoire qui manquera, même si on utilise une classe adaptée pour que factorielle soit sans problème.
C'est pour ça que le pb de la qualité de l'implem de factorielle m'a pas trop inquiété :D
A+,


bah meme pour travailler sur les grands nombres premiers il faudra que je regarde les tres grand entier dans des classes adapté


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 20:40:07    

> sinon revend une ou deux caisse de dvd
Pas évident de revendre des DVD anglais en France.
 
> bah meme pour travailler sur les grands nombres premiers il faudra que je regarde les tres grand entier dans des classes adapté
Je suis pas certain que java soit particulièrement efficace pour faire du number crunching.
Et je vois pas trop le lien avec cette histoire de permutation.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2011 à 20:41:13    

gilou a écrit :

> sinon revend une ou deux caisse de dvd
Pas évident de revendre des DVD anglais en France.
 
> bah meme pour travailler sur les grands nombres premiers il faudra que je regarde les tres grand entier dans des classes adapté
Je suis pas certain que java soit particulièrement efficace pour faire du number crunching.
Et je vois pas trop le lien avec cette histoire de permutation.
 
A+,


faire des ptits programme rigolo :o


---------------
marilou repose sous la neige
Reply

Marsh Posté le 05-12-2011 à 20:50:30    

>> faire des ptits programme rigolo
 [:totoz]  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed