J'ai fait face à ce problème en essayant de créer un module de remplissage automatique de texte. J'ai résolu le problème en créant un Trie dans lequel chaque nœud contient son nœud parent ainsi que les enfants. J'ai d'abord cherché le nœud à partir du préfixe d'entrée. Puis j'ai appliqué un Traversal sur le Trie qui explore tous les nœuds du sous-arbre avec sa racine comme nœud de préfixe. chaque fois qu'un nœud feuille est rencontré, cela signifie que la fin d'un mot à partir du préfixe d'entrée a été trouvée. En partant de ce nœud feuille, je parcours les nœuds parents obtenant le parent du parent, et atteins la racine du sous-arbre. Ce faisant, j'ai continué à ajouter les clés des noeuds dans une pile. À la fin j'ai pris le préfixe et j'ai commencé à l'ajouter en faisant sauter la pile. J'ai continué à enregistrer les mots dans une ArrayList. À la fin de la traversée, j'obtiens tous les mots à partir du préfixe d'entrée. Voici le code avec un exemple d'utilisation:
class TrieNode
{
char c;
TrieNode parent;
HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();
boolean isLeaf;
public TrieNode() {}
public TrieNode(char c){this.c = c;}
}
-
public class Trie
{
private TrieNode root;
ArrayList<String> words;
TrieNode prefixRoot;
String curPrefix;
public Trie()
{
root = new TrieNode();
words = new ArrayList<String>();
}
// Inserts a word into the trie.
public void insert(String word)
{
HashMap<Character, TrieNode> children = root.children;
TrieNode crntparent;
crntparent = root;
//cur children parent = root
for(int i=0; i<word.length(); i++)
{
char c = word.charAt(i);
TrieNode t;
if(children.containsKey(c)){ t = children.get(c);}
else
{
t = new TrieNode(c);
t.parent = crntparent;
children.put(c, t);
}
children = t.children;
crntparent = t;
//set leaf node
if(i==word.length()-1)
t.isLeaf = true;
}
}
// Returns if the word is in the trie.
public boolean search(String word)
{
TrieNode t = searchNode(word);
if(t != null && t.isLeaf){return true;}
else{return false;}
}
// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix)
{
if(searchNode(prefix) == null) {return false;}
else{return true;}
}
public TrieNode searchNode(String str)
{
Map<Character, TrieNode> children = root.children;
TrieNode t = null;
for(int i=0; i<str.length(); i++)
{
char c = str.charAt(i);
if(children.containsKey(c))
{
t = children.get(c);
children = t.children;
}
else{return null;}
}
prefixRoot = t;
curPrefix = str;
words.clear();
return t;
}
///////////////////////////
void wordsFinderTraversal(TrieNode node, int offset)
{
// print(node, offset);
if(node.isLeaf==true)
{
//println("leaf node found");
TrieNode altair;
altair = node;
Stack<String> hstack = new Stack<String>();
while(altair != prefixRoot)
{
//println(altair.c);
hstack.push(Character.toString(altair.c));
altair = altair.parent;
}
String wrd = curPrefix;
while(hstack.empty()==false)
{
wrd = wrd + hstack.pop();
}
//println(wrd);
words.add(wrd);
}
Set<Character> kset = node.children.keySet();
//println(node.c); println(node.isLeaf);println(kset);
Iterator itr = kset.iterator();
ArrayList<Character> aloc = new ArrayList<Character>();
while(itr.hasNext())
{
Character ch = (Character)itr.next();
aloc.add(ch);
//println(ch);
}
// here you can play with the order of the children
for(int i=0;i<aloc.size();i++)
{
wordsFinderTraversal(node.children.get(aloc.get(i)), offset + 2);
}
}
void displayFoundWords()
{
println("_______________");
for(int i=0;i<words.size();i++)
{
println(words.get(i));
}
println("________________");
}
}//
Exemple
Trie prefixTree;
prefixTree = new Trie();
prefixTree.insert("GOING");
prefixTree.insert("GONG");
prefixTree.insert("PAKISTAN");
prefixTree.insert("SHANGHAI");
prefixTree.insert("GONDAL");
prefixTree.insert("GODAY");
prefixTree.insert("GODZILLA");
if(prefixTree.startsWith("GO")==true)
{
TrieNode tn = prefixTree.searchNode("GO");
prefixTree.wordsFinderTraversal(tn,0);
prefixTree.displayFoundWords();
}
if(prefixTree.startsWith("GOD")==true)
{
TrieNode tn = prefixTree.searchNode("GOD");
prefixTree.wordsFinderTraversal(tn,0);
prefixTree.displayFoundWords();
}
Il serait utile pour vous de définir * quelle * partie ne fonctionne pas; envisager de dire ce que sont les entrées et les sorties attendues, puis nous montrer la sortie réelle. –
Ce n'est pas que le code ci-dessus ne fonctionne pas, il fonctionne très bien pour ce qu'il est destiné à faire qui est d'informer si la chaîne a été trouvée dans le trie ou non .... ce que je voudrais qu'il fasse, serait soit pour l'utilisateur d'entrer "th" par exemple, et pour la méthode ci-dessus (modifiée) de retourner tous les mots commençant par "th" du trie. – user330572
devoirs, aussi arbre? – Woot4Moo