IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Un arrangement plutot complexe


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 7
    Par défaut Un arrangement plutot complexe
    Bonjour tout le monde,

    Je cherche un algo efficace permettant de générer tous les arrangements possible d'un tableau de n case avec des elements pris parmis p entiers.
    Exemple : Si je souhaite creer des tableaux de 2 cases pris parmis 4 elements,
    on obtiendrait : 1,2 ; 1,3 ; 1,4 ; 2,1 ; 2,3 ; 2,4 ; 3,1 ; 3,2 ; 3,4 ; 4,1 ; 4,2 ; 4,3

    En fait pour etre precis, je recherche quelque chose de recursif où l'on aurait pas besoin de stocker tous les tableaux en memoire (car avec stockage des tableaux, j'ai reussi a faire un petit truc mais c'est loin d'etre top...) En effet, je dois travailler avec 50 elements, et donc pour des tableaux de 7 cases, il faudrait deja 40 To de memoire !
    Si quelqu'un a une petite idée de comment faire...

    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Ah... encore un arbre des possibles. C'est a la mode, ca fait mon 2eme en 2 jours . Y'aurait pas comme un sujet de TP commun

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    public class ArbreDesPossibles {
     
    	private int size = 0;
    	private int[] result = null;
    	private List<Integer> elements;
     
    	public ArbreDesPossibles(int size, int[] elts) {
    		this.size = size;
    		this.result = new int[size];
    		this.elements = new ArrayList<Integer>();
    		for(int i:elts) this.elements.add(i);
    	}
     
    	public void compute(int currentPos) {
     
    		// la tableau est remplit
    		if (currentPos==this.size) {
    			print();
    			return;
    		}
     
    		// essaye tous les cas possible
    		for(int i=0;i<elements.size();i++) {
    			// on retire le 1er element de la liste des elements restants
    			Integer element = elements.remove(0);
    			// on le met a la position courante dans le tableau 
    			result[currentPos]=element;
    			// on demande le calcul de la position suivante du tableau
    			compute(currentPos+1);
    			// on remet l'element qu'on avait retiré, au bout de la liste des elements restants
    			elements.add(element);
    		}
    	}
     
    	public void print() {
    		System.out.println( Arrays.toString(this.result) );
    	}
     
    	public static void main(String[] args) {
    		new ArbreDesPossibles(2,new int[]{1,2,3,4}).compute(0);
    	}
    }
    En effet, je dois travailler avec 50 elements, et donc pour des tableaux de 7 cases
    La profondeur de recursion est egale a la taille du tableau, donc 7. C'est pas enorme . Enfin bon, j'ai quand meme optimisé le code pour limiter la consommation mémoire.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par pseudocode
    Ah... encore un arbre des possibles. C'est a la mode, ca fait mon 2eme en 2 jours . Y'aurait pas comme un sujet de TP commun

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    public class ArbreDesPossibles {
     
    	private int size = 0;
    	private int[] result = null;
    	private List<Integer> elements;
     
    	public ArbreDesPossibles(int size, int[] elts) {
    		this.size = size;
    		this.result = new int[size];
    		this.elements = new ArrayList<Integer>();
    		for(int i:elts) this.elements.add(i);
    	}
     
    	public void compute(int currentPos) {
     
    		// la tableau est remplit
    		if (currentPos==this.size) {
    			print();
    			return;
    		}
     
    		// essaye tous les cas possible
    		for(int i=0;i<elements.size();i++) {
    			// on retire le 1er element de la liste des elements restants
    			Integer element = elements.remove(0);
    			// on le met a la position courante dans le tableau 
    			result[currentPos]=element;
    			// on demande le calcul de la position suivante du tableau
    			compute(currentPos+1);
    			// on remet l'element qu'on avait retiré, au bout de la liste des elements restants
    			elements.add(element);
    		}
    	}
     
    	public void print() {
    		System.out.println( Arrays.toString(this.result) );
    	}
     
    	public static void main(String[] args) {
    		new ArbreDesPossibles(2,new int[]{1,2,3,4}).compute(0);
    	}
    }

    La profondeur de recursion est egale a la taille du tableau, donc 7. C'est pas enorme . Enfin bon, j'ai quand meme optimisé le code pour limiter la consommation mémoire.
    Tu me diras quelle note tu as eu à la place de l'auteur du sujet

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 7
    Par défaut
    Merci avous, pour cette reponse si rapide !

    J'vais quand meme faire ma petite enquete pour savoir si l'autre personne concerné ne fais pas partie de ma promo (ca serait pas cool qu'on m'accuse de plagia)

    Bonne journee à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Algo] Trouver un arrangement ou une combinaison d'éléments
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 20/04/2013, 11h46
  2. Réponses: 5
    Dernier message: 04/08/2003, 21h50
  3. Enumération de l'arrangement Anp
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 28/04/2003, 09h05
  4. Réponses: 7
    Dernier message: 07/04/2003, 09h35
  5. C, C++ et assembleur, plutot amis ?
    Par ShinMei dans le forum C
    Réponses: 2
    Dernier message: 18/01/2003, 00h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo