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 :

Chercher toutes les combinaisons de n arguments à partir d'une chaîne


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Lycéen-Développeur Java autodidacte
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen-Développeur Java autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Par défaut Chercher toutes les combinaisons de n arguments à partir d'une chaîne
    Bonjour à tous,
    Actuellement j'aurai besoin pour une épreuve de connaître toutes les combinaisons de 8 caractères que l'on peut obtenir à partir de la chaîne "azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789_$&#@" ...

    J'ai entendu parler de "l'étoile de Kleene" qui, après de petites recherches, semble correspondre, mais je ne sais malheureusement pas comment la mettre en oeuvre en Java

    J'aimerai savoir si certains ont déjà rencontré cette nécessité ou sauraient comment résoudre ce problème (ou, si une discussion qui en parle m'a échappé, avoir un lien y menant).

    J'ai tenté ceci de mon côté, mais si quelqu'un a un code plus efficace ... :
    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
     
    import java.io.* ;
    public class js
    {
        static String tab="azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789_$&#@";
        static int taille=tab.length();
     
        public static void main(String[] args)throws IOException{
            generer(8, "");
        }
     
    // nbr : nombre de caractères que doivent contenir les chaînes de résultat
    public static void generer(int nbr, String sb) throws IOException
       {String result = "";
        if (sb.length()==nbr)
        {
             //on enregistre la chaîne
             result += sb + "\n";
             return;
        }
       //taille est la longeur totale de la chaîne de référence
        for(int i=0; i<taille; i++)
        {
          generer(nbr, sb+tab.charAt(i));
        }
     
        //Ici FluxFichier.écrire() est une méthode perso qui écrit dans
    //un fichier passé en argument le contenu d'un chaîne passée en argument2
    	FluxFichier.écrire("/home/lev-arcady/Documents/test.txt", result);
       }
    }
    Merci de votre aide !

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Laisse juste tomber, tu vas droit dans le mur. Tu vas exploser les limites de mémoire/fichier très rapidement.
    Pour ton exemple avec les combinaisons 8 caractères parmi 67, il y a 67^8 résultats qui occuperont au minimum 8 octets soit un total d'environ 2 954 To (3 025 439 Go)

  3. #3
    Membre confirmé

    Homme Profil pro
    Lycéen-Développeur Java autodidacte
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen-Développeur Java autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Par défaut
    Aïe :p me disais aussi qu'un calcul qui n'a toujours pas fini en une nuit non-stop ...

    Edit : je viens de m'apercevoir en relisant l'épreuve qu'il s'agit non pas de 8 mais de 6 caractères ... donc 67^6 solutions selon toute logique (ce qui m'avance un peu mais pas trop).

    Et si j'ajoute une condition comme ne pas prendre en compte le résultat s'il contient 3x ou plus le même caractère de suite, histoire de garder les solutions ayant possiblement un sens, tu penses que ça réduirait ce chiffre de beaucoup ou pas ?

    Edit 2 : voilà le code que j'ai incluant cette condition :
    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
    import java.io.* ;
    public class js
    {
        static String tab="azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789_$&#@";
        static int taille=tab.length();
     
        public static void main(String[] args)throws IOException{
            generer(6, "");
        }
     
    // nbr : nombre de caractères que doivent contenir les chaînes de résultat
    public static void generer(int nbr, String sb) throws IOException
       {
    	breaker : {String result = "";
        if (sb.length()==nbr)
        {
        	char [] prob = sb.toCharArray();
        	for(int h=0; h<3; h++){
        		if(prob[h]==prob[h+1] && prob[h+1]==prob[h+2]){
        			//Si trois caractères de suite sont identiques, on passe à la combinaison suivante;
        			//sinon on décale le test d'un caractère et ce jusqu'à avoir testé toute la combinaison
        			break breaker;
        		}
        	}
             //on enregistre la chaîne
             result += sb + "\n";
             System.out.println(sb);
             return;
         }
       //taille est la longeur totale de la chaîne de référence
        for(int i=0; i<taille; i++)
        {
          generer(nbr, sb+tab.charAt(i));
        }
     
        //Ici FluxFichier.écrire() est une méthode perso qui écrit dans un fichier passé en argument le contenu d'un chaîne passée en argument2
    	FluxFichier.écrire("/home/lev-arcady/Documents/test.txt", result);
       }
       }
    }

  4. #4
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Citation Envoyé par zeusolym Voir le message
    Je viens de m'apercevoir en relisant l'épreuve qu'il s'agit non pas de 8 mais de 6 caractères ... donc 67^6 solutions selon toute logique (ce qui m'avance un peu mais pas trop).

    Et si j'ajoute une condition comme ne pas prendre en compte le résultat s'il contient 3x ou plus le même caractère de suite, histoire de garder les solutions ayant possiblement un sens, tu penses que ça réduirait ce chiffre de beaucoup ou pas ?
    Ça reste un résultat qui prendrait plusieurs centaines de Go à stocker, je suppose qu'il y a une incompréhension sur l’énoncé de ton exercice. J'imagine mal un professeur donner un exercice qui met a genoux une machine standard.

    Je suppose que ce que ton professeur attend c'est les combinaisons au sens mathématique ce qui donnerais 67!/(6!*61!) résultats soit environ 100 millions. On aurait une quantité de résultat gérable.

    Un autre éventuel problème serait ta méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FluxFichier.écrire("/home/lev-arcady/Documents/test.txt", result)
    qui, je suppose va ré-ouvrir le fichier à chaque écriture ce qui risque de fortement ralentir, à moins qu'elle garde dans une sorte de cache les connexions aux fichier passés en paramètre en cache.

  5. #5
    Membre confirmé

    Homme Profil pro
    Lycéen-Développeur Java autodidacte
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen-Développeur Java autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Par défaut
    Citation Envoyé par Uther Voir le message

    Je suppose que ce que ton professeur attend c'est les combinaisons au sens mathématique ce qui donnerais 67!/(6!*61!) résultats soit environ 100 millions. On aurait une quantité de résultat gérable.
    Très bien je fonce sur le lien Merci

    Citation Envoyé par Uther Voir le message
    Un autre éventuel problème serait ta méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FluxFichier.écrire("/home/lev-arcady/Documents/test.txt", result)
    qui, je suppose va ré-ouvrir le fichier à chaque écriture ce qui risque de fortement ralentir, à moins qu'elle garde dans une sorte de cache les connexions aux fichier passés en paramètre en cache.
    Il me semble, mais peut-être est-ce une erreur de ma part, que cette méthode est placée de façon à écrire, une fois les combinaisons générées, l'ensemble, non ? Sinon effectivement le fichier est ouvert puis fermé après l'écriture par cette méthode, que voici :
    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
    public static void écrire(String place, String texte) throws IOException{
    		annuler : 
    		{try
    		{
    			private static PrintWriter scribe = new PrintWriter(new FileWriter(place));
    			scribe.println(texte);
    		}
     
    		catch(IOException e){
    			System.out.println("Une exception de type IOException est survenue. L'action est annulée");
    			break annuler;
    		}
    		}
    	scribe.close();
    	}

  6. #6
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    En effet, j'avais regardé le code un peu vite.

    Il faudrait que tu ouvres le flux au début et que tu écrive dedans au fur et a mesure, sinon tu satureras la mémoire.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/02/2013, 13h03
  2. Réponses: 23
    Dernier message: 18/02/2010, 15h42
  3. retouver toute les combinaison
    Par sami_c dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 22/03/2006, 20h09
  4. chercher toutes les entrées comprise entre deux dates
    Par kabool dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/03/2006, 10h12
  5. Lister toutes les combinaisons...
    Par monstroplante dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/11/2005, 21h10

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