Compte tenu d'un tableau à chaîne, renvoyez tous les groupes de chaînes qui sont des anagrammes. P>
Mes solutions: P>
Pour chaque mot de chaîne dans la matrice, triez-la O (m lg m), m est la longueur moyenne d'un mot. p>
Construire une table de hachage Mettez le mot trié dans la table de hachage comme clé et générer toutes les permutations (O (m!)) du mot, recherchez chaque permutation dans un dictionnaire (une carte d'arborescence préfixe) avec O (m), si elle est Dans le dictionnaire, placez (O (1)) dans la table de hachage de sorte que tous les mots permutés soient mis dans la liste avec la même clé. P>
Totalement, O (N * M * LG M * M!) Heure et O (N * M!) Espace, N est la taille de la matrice donnée. P>
Si m est très grand, ce n'est pas efficace, m! . p>
De meilleures solutions? p>
merci p>
5 Réponses :
Utilisez Compter Trier pour trier le mot afin que le tri peut être effectué dans O (m). Après le tri générant la clé de Word et insérez un nœud (touche, valeur) dans HASHTABLE. La clé de génération peut être réalisée dans O (m). P>
Vous pouvez prendre de la valeur (clé, valeur) comme une matrice dynamique pouvant contenir plus d'une chaîne. Chaque fois que vous insérez une clé qui est déjà présente, appuyez simplement sur le mot d'origine à partir de laquelle la clé est générée sur une matrice de valeur. P>
Complexité de temps globale si (mn) où n est le nombre total de mots (taille de l'entrée). P>
Ce lien a également une solution à des problèmes similaires-> http://yourbitsandbytes.com/viewtopic.php?f=10&t=42 p>
Nous définissons un alphabet, qui contient chaque lettre que nous pourrions avoir dans notre wordlist. Ensuite, nous avons besoin d'une prime différente pour chacune des lettres de l'alphabet, je recommande d'utiliser le plus petit que vous pouvez trouver.
qui nous donnerait la cartographie suivante: {a => 2, b => 3, c => 5, d => 7, etc} p>
comptez maintenant les lettres du mot que vous souhaitez représenter comme entier et construire votre integer entier comme entier. Suit: p>
pseudocode: p> Quelques exemples: p> AAAA => 2 ^ 4 P> AABB => 2 ^ 2 * 3 ^ 2 = bbaa = baba = ... p> et ainsi de suite. P> Vous aurez donc un entier représentant chaque mot dans votre dictionnaire et le mot Vous voulez vérifier sera capable d'être converti en un entier. Donc, si n est la taille de votre liste de mots et k est la taille du mot le plus long que cela prendra O (nk) pour construire votre nouveau dictionnaire et O (k) pour vérifier un nouveau mot. P> Hackthissite. com a un défi de programmation qui est: donné un mot brouillé, regardez-le dans un dictionnaire pour voir si des anagrammes de celui-ci sont dans le dictionnaire. Il y a un Bon article sur une solution efficace au problème à partir duquel j'ai emprunté la réponse, elle entre également dans détail sur d'autres optimisations. p> p>
Nous devrions également envisager le coût de la construction de l'alphabet O (Tailleof (Dictionnaire) * K). Dans votre solution, O (NK) est destiné au tableau de chaînes donné non pour le dictionnaire. Merci
Ouais, j'aurais dû être plus clair là-bas, n est la taille du dictionnaire et le matrice de chaîne que vous avez donné serait peut-être que l'exécution serait peut-être une fois que le dictionnaire avait été construit
C'est une solution folle. En utilisant votre schéma, le mot "pizza" entraîne une valeur supérieure à 9,6 E19. Vos valeurs dépasseront régulièrement la plage de nombres de 64 bits, et il existe des mots anglais qui dépasseront la plage de numéros de 128 bits. Vous ferez mieux d'utiliser des clés de chaîne.
#include <map> #include <iostream> #include <set> #include <algorithm> int main () { std::string word; std::map<std::string, std::set<std::string>> anagrams; while(std::cin >> word) { std::string sortedWord(word); std::sort(sortedWord.begin(), sortedWord.end()); anagrams[sortedWord].insert(word); } for(auto& pair : anagrams) { for(auto& word : pair.second) { std::cout << word << " "; } std::cout << "\n"; } } I'll let someone who is better at big-O analysis than I am figure out the complexities.
M - Nombre maximum de caractères dans n'importe quelle chaîne, N - Nombre total de chaînes. m * Log m pour trier chaque chaîne. M * journal n pour insérer dans anagrammes code>. Facteur M puisque chaque comparaison de chaînes prend le temps O (m). Par conséquent, O (n * m * (journal n + journal m) est une limite supérieure.
Tournez le dictionnaire en une cartographie des caractères triés d'un mot mappé sur chaque mot de ces personnages et stockez cela. Pour chaque mot que vous recevez, triez-le et ajoutez la liste des anagrammes à partir de la mappage à votre sortie. P>
Je ne crois pas que vous puissiez faire mieux dans O termes que p>