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

Java Discussion :

[Algorithme] Enumérer les combinaisons


Sujet :

Java

  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut [Algorithme] Enumérer les combinaisons
    Bonjour à tous

    Je poste en Java parce que je code pour l'instant en Java, mais c'est en fait une question d'algo.

    J'ai une série d'objet, et je souhaite tous les énumérer sans relation d'ordre :

    {a,b,c}

    0
    a
    b
    c
    ab
    ac
    cb
    abc

    On est donc en 2^n
    Je peux éventuellement connaître le n.
    Comment faire ça ?

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Tu pars d'une List<Set<String>>, qui commence avec un élément : un set vide.
    Tu itères sur les éléments de ton set de départ, puis sur les Sets de ta liste. Au sein de cette itération, pour chaque Set, tu le copies et tu rajoutes l'élément en cours, et tu le colles dans une liste de set, que tu ajouteras à la fin de l'itération sur l'élément.

    Edit : quelque chose du genre :
    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
     
    	public static List<Set<String>> combinaisons(Set<String> elements) {
    		List<Set<String>> listeCombinaisons = new LinkedList<Set<String>>();
    		Set<String> elementVide = new HashSet<String>();
    		listeCombinaisons.add(elementVide);
     
    		for (String element : elements) {
    			List<Set<String>> listeNouvellesCombinaisons = new LinkedList<Set<String>>();
    			for (Set<String> set : listeCombinaisons) {
    				Set<String> nouvelleCombinaison = new HashSet<String>(set);
    				nouvelleCombinaison.add(element);
    				listeNouvellesCombinaisons.add(nouvelleCombinaison);
    			}
    			listeCombinaisons.addAll(listeNouvellesCombinaisons);
    		}
    		return listeCombinaisons;
    	}

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Bonjour,

    Énumérer les combinaisons, il fallait aussi que je fasse ce genre de chose dans ce code en java ici : #10...

    Est-ce que dans ton cas aussi le nombre d'objets est variable ? Que sont ces objets (car je suppose que ce ne sont pas des lettres de l'alphabet) ?

    ...

  4. #4
    Membre éprouvé Avatar de +Guilhem
    Profil pro
    Ingénieur d'études Java/JEE
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études Java/JEE

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Tu pars d'une List<Set<String>>, qui commence avec un élément : un set vide.
    Tu itères sur les éléments de ton set de départ, puis sur les Sets de ta liste. Au sein de cette itération, pour chaque Set, tu le copies et tu rajoutes l'élément en cours, et tu le colles dans une liste de set, que tu ajouteras à la fin de l'itération sur l'élément.

    Edit : quelque chose du genre :
    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
     
    	public static List<Set<String>> combinaisons(Set<String> elements) {
    		List<Set<String>> listeCombinaisons = new LinkedList<Set<String>>();
    		Set<String> elementVide = new HashSet<String>();
    		listeCombinaisons.add(elementVide);
     
    		for (String element : elements) {
    			List<Set<String>> listeNouvellesCombinaisons = new LinkedList<Set<String>>();
    			for (Set<String> set : listeCombinaisons) {
    				Set<String> nouvelleCombinaison = new HashSet<String>(set);
    				nouvelleCombinaison.add(element);
    				listeNouvellesCombinaisons.add(nouvelleCombinaison);
    			}
    			listeCombinaisons.addAll(listeNouvellesCombinaisons);
    		}
    		return listeCombinaisons;
    	}
    Et avec une quinzaine d'éléments on peut aller prendre un café avant le résultat.

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    15 ça passe encore pas trop mal chez moi, mais faut pas aller chercher beaucoup plus loin, vers 20 ça devient vraiment très long.
    En même temps, générer 2^20 sets ...

  6. #6
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut
    Ce sont des entiers, le but était en fait de résoudre le problème de partition, donc j'ai fait ça en récursif avec un tableau, je suis encore autour des 4 secondes pour 25 éléments, par contre je passe à 80 secondes pour 30 éléments.

  7. #7
    Invité de passage
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1
    Par défaut
    Bonjour,

    Cela fait un bon moment que j'essaie de trouver une réponse à mon problème mais rien à faire. Je me permet de s’adresser à vous pour une aide.
    J'ai un ensemble de nombre E ={1,2,3,4} et je veux avoir toutes les solutions permettant de diviser E en sous ensembles.

    Par exemple pour 3 nombres les sous ensembles sont:
    {1,2,3}
    {1}, {2,3}
    {1,2},{3}
    {1,3},{2}
    {1},{2},{3}
    Pour 4 nombre c'est plus compliqué car on peut avoir plus de deux sous ensemble on a 3 sous ensembles pour chaque solution:
    par exemple:
    {1,2},{3,4}
    {1,2},{3},{4}
    {1},{2},{3,4}

    Quelqu'un a une idée sur comment faire la récursion ?

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

Discussions similaires

  1. [Tableaux] Algorithme pour les combinaisons
    Par Death83 dans le forum Langage
    Réponses: 33
    Dernier message: 09/08/2010, 14h31
  2. Réponses: 5
    Dernier message: 18/06/2007, 20h52
  3. Lister toutes les combinaisons...
    Par monstroplante dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/11/2005, 21h10
  4. Enumérer les TAPEs
    Par Amri_Daly dans le forum Windows
    Réponses: 1
    Dernier message: 31/10/2005, 17h09
  5. Enumérer les ports COM ...
    Par Marco85 dans le forum Windows
    Réponses: 3
    Dernier message: 13/10/2005, 14h30

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