(JAVA) out of memory error
OK I'm implementing a data structure called "trie" to store a dictionary of words. The text file I'm reading in has over 172K words....this, with a good implementation of a trie should not take more than 20-22MBs of memory. For some reason my implementation gives me an OutOfMemoryError.
If I use a small dictionary....say 50K words everything is fine...any ideas?
BTW...I'm passing a hashedMap set to add.
Code:
class TrieNode {
TrieNode[] myLinks;
boolean myIsWord;
String myWord;
/**
* create a new TrieNode (characters a-z and ' ')
*/
public TrieNode() {
myLinks = new TrieNode[Trie.ALPH];
myIsWord = false;
myWord = null;
}
}
public class Trie {
TrieNode root;
public static final int ALPH = 27;
public Trie() {
root = new TrieNode();
}
/**
* Add a string to the trie
*
* @param s The string added to Trie
*/
public void add(String s) {
TrieNode t = root;
int limit = s.length();
for(int k=0; k < limit; k++) {
int index = index(s.charAt(k));
if (t.myLinks[index] == null) {
t.myLinks[index] = new TrieNode();
}
t = t.myLinks[index];
}
t.myIsWord = true;
t.myWord = s;
}
/**
* print every word in the trie, one per line
*
*/
public void printTrie() {
printTrie(root);
}
private void printTrie(TrieNode t) {
if (t != null) {
if (t.myIsWord) {
System.out.println(t.myWord);
}
for(int k=0; k < ALPH; k++) {
if (t.myLinks[k] != null) {
// System.out.println("Descend to child " + letter(k));
printTrie(t.myLinks[k]);
}
}
}
}
/**
* determine if a word is in the trie (starting at root)
*
* @param s The string searched for
* @return true iff s is in trie (starting at root)
*/
public boolean contains(String s) {
TrieNode t = root;
int limit = s.length();
for(int k=0; k < limit; k++) {
int index = index(s.charAt(k));
if (t.myLinks[index] == null) return false;
t = t.myLinks[index];
}
return t.myIsWord;
}
// convert all unknown symbols to spaces
public static int index(char ch) {
int i = (int) (ch - 'a');
if ((i < ALPH-1) && (i >= 0))
return i;
else
return ALPH-1;
}
public static char letter(int i) {
if (i == ALPH-1)
return ' ';
else
return (char) (i + 'a');
}
}