9
votes

Tous les mots possibles

Je veux créer toutes les mots possibles 5 lettres à l'aide d'AZ.Veuillez suggérer des algorithmes bons et rapides.

J'ai essayé de créer un et il ressemble à ceci ... p>

     byte[] allchar=new byte[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
 int lengthOfAllChar=allchar.length;
         System.out.println(lengthOfAllChar);
        for (int i = 0; i < lengthOfAllChar; i++){
            for(int j = 0; i < lengthOfAllChar; j++){
                StringBuffer finalWordBuffer = new StringBuffer();
                finalWordBuffer.append((char)allchar[i]);
                finalWordBuffer.append((char)allchar[j]);
            }
        }


13 commentaires

Nous parlons de mots de 12 m. Bonne chance avec cet algorithme rapide :)


Non, j'ai créé un.et ça ressemble à ceci ... pour (int i = 0; i


La notation Big O est (o ^ 5), et dans votre cas = 11881376 mots. Bonne chance!


Un certain contexte pourrait aider. Quelle langue (pas le langage de programmation!)? Pourquoi les générez-vous, au lieu de les regarder d'un dictionnaire? Ce devoir est-il ou une affectation d'une sorte?


Quelles sont les règles pour vos mots (par exemple, pas plus de deux voyelles consécutives)? J'espère qu'il y en a, car sinon, c'est un problème très facile à résoudre.


@Autometa, relisez à nouveau mon commentaire s'il vous plaît. Je n'ai spécifiquement pas demandé le langage de programmation car ces informations sont déjà dans les balises de votre "question". Veuillez également répondre toutes les questions . Merci.


@Autometa: Modifiez votre question et ajoutez le code là-bas au lieu d'afficher comme un commentaire. N'oubliez pas de Mark comme code.


Les règles seront ajoutées après avoir un algorithme rapide et fiable ...


À quelle vitesse faut-il? Je viens d'écrire un programme de test faire ici, et cela génère toutes les permutations (pas les mots réels) et les écrit dans un fichier en 1,6 secondes sur ma machine. Je ne suis pas sûr que tous ces commentaires seront très lents sont si précis.


@ Carl..Can vous postez-le dans les réponses ...


@Autometa, je l'ai écrit en C, alors je ne pense pas que cela vous aiderait. Je peux le poster si vous voulez, cependant.


si c'est différent de ce que j'utilise..y o u r accueil


-1 électeurs, veuillez expliquer ce qui ne va pas avec cette question, je pense que c'est une question complètement valide, nous ne sommes pas ici pour résoudre des erreurs de syntaxe stupides.


5 Réponses :


0
votes

Voici un algorithme pour vous d'essayer, en pseudocode: xxx

Vous devriez pouvoir traduire facilement ce pseudocode en code Java approprié. Le seul bit tressé génère la chaîne aléatoire. Vous pouvez prendre votre éventail de lettres, choisir une valeur aléatoire entre 1 et 26, puis l'utiliser pour une lettre. Répétez cette opération cinq fois et vous avez une chaîne de cinq lettres!

s'il s'agit ou non d'un "bon" ou "rapide" algorithme est à vous. Vous n'avez pas défini ce que "bon" ou "rapide" signifie, donc je suis incapable de juger. Vous pouvez avoir des critères différents que moi.

Notez que cela générera toutes les chaînes qui en ont cinq lettres. Ce ne seront probablement pas des mots. À juger de votre exemple de code, vous voulez toutes les chaînes qui en ont cinq lettres, pas de mots qui en ont cinq lettres.


3 commentaires

Pourquoi compliquer les choses avec génération de nombres aléatoires? Cinq pour Les boucles garantissent que tous les "mots" sont créés, sans doublons.


est la chaîne dans des mots verts? Cela devient difficile ... Vous devez faire correspondre chaque mot généré ..


@Vlad: "Que ce soit ou non un" bon "ou" rapide "algorithme est à vous." :-) Il existe des moyens évidents de résoudre ce problème, j'ai donné une personne non évidente.



25
votes

Voici un exemple de génération de toutes les séquences pour tout ensemble de caractères à n'importe quelle longueur: xxx

Ceci prend environ 250 ms sur ma machine pour itérer toutes les 11 881 376 séquences.

Notez qu'un nouveau Char [LEN] n'est créé qu'une seule fois au début et réutilisé en tant que construction pour la construction des permutations. Le premier appel à itérer () commence par un POS de 0 . Passer à la boucle de la boucle où il se glisse à travers chacun des caractères. Le premier caractère de construction est défini sur cela, puis nous appelons récursivement la même méthode pour définir le suivant à POS + 1 . Une fois que cela s'est passé 5 fois, le point de vente sera à len . Ceci est lorsque le pos == len commence en haut de la méthode. Ensuite, il construit simplement une chaîne de ce qui est construit dans la construction et il y a votre mot.


7 commentaires

Tats Cool !!!! Cela semble un peu délicat ... Allez-vous expliquer un peu comment cela fonctionne..Il sera vraiment utile.


Bien sûr, je vais expliquer. Notez qu'un neuf Char [len] est uniquement créé une fois au début et réutilisé comme Build pour la construction des permutations. Le premier appel à itérer () commence par un POS de 0. Sautez sur le pour boucle où il boucle chaque caractères . Le premier Char de Build est défini sur cela, puis nous appelons récursivement la même méthode pour définir la suivante à pos + 1 . Une fois que cela s'est produit 5 fois le POS sera à len . Ceci est lorsque le pos == len commence en haut de la méthode. Ensuite, il construit simplement une chaîne de ce qui est construit dans Construire et il y a votre mot.


Juste correction ... Ce ne sont pas des permutations, mais seulement des séquences de longueur 5. Lorsque vous avez 26 caractères, un mot de 5 lettres ne peut pas être une "permutation" d'entre eux.


J'aime comment vous avez utilisé une méthode nommée "itérer" pour recueil ...;)


@antti: Oups que vous avez raison, renommé permutations à des séquences.


@jtahlborn: hehe, je vais partir ça :)


Juste curieux, quelqu'un sait-il si le Big O sur cet algorithme est 2 ^ N?



5
votes

Ceci peut être fait facilement aussi sans récursion (ici in c) xxx pré>

ou vous pouvez le faire avec le transport: p>

char tmp[6]; int i, k;
strcpy(tmp, "aaaaa");
for (i=0;i<26*26*26*26*26;i++) {
   output_string(tmp);
   tmp[4]++;
   k = 4;
   while (k > 0 && tmp[k] == 'z') { tmp[k] = 'a'; k--; tmp[k]++; }
}


0 commentaires

3
votes
public static List<String> getAll(int length) {
    final char[] chars = "0123456789".toCharArray();
    final double NUMBER_OF_PERMUTATIONS = Math.pow(chars.length, length);

    List<String> words = new ArrayList<>(Double.valueOf(
            NUMBER_OF_PERMUTATIONS).intValue());

    char[] temp = new char[length];
    Arrays.fill(temp, '0');

    for (int i = 0; i < NUMBER_OF_PERMUTATIONS; i++) {
        int n = i;
        for (int k = 0; k < length; k++) {
            temp[k] = chars[n % chars.length];
            n /= chars.length;
        }
        words.add(String.valueOf(temp));
    }
    return words;
}  
Here is the Java 7 version of antti.huima's code.

1 commentaires

Joli. Fonctionne comme un charme. Merci.



0
votes
public void wordCreator(int length){
    Random rnd=new Random();
    String word;
    do{
        word="";
        for(int j=0; j<length; j++){
            int index=rnd.nextInt(data.length);   //data is a String array letter of the alpabet
            word+=data[index];
        }
    }while(wordMap.containsValue(word));
    wordMap.put(i, word);
    i++;
}Here is your algorithm

0 commentaires