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]); } }
5 Réponses :
Voici un algorithme pour vous d'essayer, en pseudocode: 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! P> 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. P> 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. P> p>
Pourquoi compliquer les choses avec génération de nombres aléatoires? Cinq pour code> 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.
Voici un exemple de génération de toutes les séquences pour tout ensemble de caractères à n'importe quelle longueur: Ceci prend environ 250 ms sur ma machine pour itérer toutes les 11 881 376 séquences. p> Notez qu'un nouveau Char [LEN] CODE> 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 () code> commence par un
POS code> de
0 code>. 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 code>. Une fois que cela s'est passé 5 fois, le point de vente sera à
len code>. Ceci est lorsque le
pos == len code> commence en haut de la méthode. Ensuite, il construit simplement une chaîne code> code> de ce qui est construit dans la construction et il y a votre mot. P> p>
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] code> est uniquement créé une fois au début et réutilisé comme
Build code> pour la construction des permutations. Le premier appel à
itérer () code> commence par un
POS code> de 0. Sautez sur le
pour code> boucle où il boucle chaque
caractères code>. Le premier
Char code> de
Build code> est défini sur cela, puis nous appelons récursivement la même méthode pour définir la suivante à
pos + 1 code>. Une fois que cela s'est produit 5 fois le
POS code> sera à
len code>. Ceci est lorsque le
pos == len code> commence en haut de la méthode. Ensuite, il construit simplement une chaîne code> code> de ce qui est construit dans
Construire code> 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?
Ceci peut être fait facilement aussi sans récursion (ici in c) 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]++; }
}
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.
Joli. Fonctionne comme un charme. Merci.
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
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 b>. Merci.
@Autometa: Modifiez votre question et ajoutez le code là-bas au lieu d'afficher comme un commentaire. N'oubliez pas de Mark i> 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.