Devo implementare uno Trie (in Java) per un progetto college. Il Trie dovrebbe essere in grado di aggiungere e rimuovere stringhe (per la fase 1)."Semplice" Implementazione Trie
Ho trascorso diverse ore ogni giorno (negli ultimi giorni) cercando di capire come fare questo e FAILED miseramente ogni volta.
Ho bisogno di aiuto, gli esempi su internet e il mio libro di testo (Strutture dati e algoritmi in Java di Adam Drozdek) non aiutano.
Informazioni
classi nodo con cui sto lavorando:
class Node { public boolean isLeaf; } class internalNode extends Node { public String letters; //letter[0] = '$' always. //See image -> if letter[1] = 'A' then children[1] refers to child node "AMMO" //See image -> if letter[2] = 'B' then children[2] refers to internal node "#EU" public TrieNode[] children = new TrieNode[2]; public TrieInternalNode(char ch) { letters = "#" + String.valueOf(ch);//letter[0] = '$' always. isLeaf = false; } } class leafNode extends Node { public String word; public TrieLeafNode(String word) { this.word = new String(word); isLeaf = true; } }
Ed ecco il codice pseudo per l'inserimento che ho bisogno di seguire: (in guardia è molto vaga)
trieInsert(String K) { i = 0; p = the root; while (not inserted) { if the end of word k is reached set the end-of-word marker in p to true; else if (p.ptrs[K[i]] == 0) create a leaf containing K and put its address in p.ptrs[K[i]]; else if reference p.ptrs[K[i]] refers to a leaf { K_L = key in leaf p.ptrs[K[i]] do { create a nonleaf and put its address in p.ptrs[K[i]]; p = the new nonleaf; } while (K[i] == K_L[i++]); } create a leaf containing K and put its address in p.ptrs[K[--i]]; if the end of word k is reached set the end-of-word marker in p to true; else create a leaf containing K_L and put its address in p.ptrs[K_L[i]]; else p = p.ptrs[K[i++]]; } }
Ho bisogno di implementare i seguenti metodi.
public boolean add(String word){...}//adds word to trie structure should return true if successful and false otherwise public boolean remove(String word){...}//removes word from trie structure should return true if successful and false otherwise
non posso trovare pseudo codice per la rimozione, ma se inserto non funziona eliminare abitudine che ti aiuti.
Ecco un'immagine di come dovrebbe apparire il Trie che ho bisogno di implementare.
Sono consapevole del fatto che la Trie sarà ancora inefficiente se attuata in questo modo, ma al momento non ho bisogno di preoccuparsi di questo.
il libro fornisce un'implementazione che è simile a quello che devo fare, ma non utilizza la fine del char parola ('$') e memorizza solo le parole senza i loro prefissi nel bambino nodi
http://mathcs.duq.edu/drozdek/DSinJava/SpellCheck.java
Vincoli
- ho bisogno di attuare il trie in JAVA.
- Non è possibile importare o utilizzare nessuna delle strutture di dati incorporate di Java. (cioè nessuna mappa, HashMap, ArrayList ecc.)
- Posso utilizzare matrici, tipi primitivi Java e stringhe Java.
- Il Trie deve utilizzare un simbolo
$
(dollaro) per indicare una fine parola. (Vedi immagine sotto)
- io possa asume che ora la parola contenente il simbolo
$
verrà inserito. - Ho bisogno di implementare il Trie nello stesso stile del libro.
- Il caso delle parole non ha importanza.tutte le parole saranno considerate minuscole
- Il Trie deve solo memorizzare il carattere di fine parola ei caratteri applicabili a una parola e non l'intero alfabeto (come alcune implementazioni).
Non mi aspetto che qualcuno faccia l'implementazione per me (a meno che non ne abbia uno in giro: P) Ho davvero bisogno di aiuto.
Questa implementazione Trie soddisfa le tue esigenze ad eccezione del carattere "$" di fine parola. Dovresti usarlo come punto di partenza o riferimento. https://github.com/phishman3579/java-algorithms-implementation/blob/master/src/com/jwetherell/algorithms/data_structures/Trie.java – Justin
@Justin Grazie per il link ma sfortunatamente questo non è ottimale ma potrei essere in grado di utilizzare alcune delle funzionalità. Il codice collegato memorizza solo un char alla volta in ciascun nodo e mai l'intera parola in un nodo foglia. Quindi invece di 'A-> AMMO' IT' A-> M-> M-> O' (fine della parola per 'O' = true) – user3553706
Ah, non mi rendevo conto che era compatto. Date un'occhiata a questo link dallo stesso sito: https://github.com/phishman3579/java-algorithms-implementation/blob/master/src/com/jwetherell/algorithms/data_structures/RadixTrie.java – Justin