Я реализую дерево суффиксов (это отличается от дерева суффиксов), которое хранит суффиксы символов строк в виде узлов в древовидной структуре, где строка составляется путем обхода дерева до тех пор, пока вы не нажмете «$» или не нажмете конец вашего поиска.
Проблема в том, что при построении этого дерева потребляется больше памяти, чем в Java при использовании большого текстового файла. Есть ли место, где я мог бы сократить использование памяти с точки зрения структур данных? Это домашнее задание, и нет необходимости делать его сжатым деревом суффиксов (которое в основном представляет собой дерево суффиксов).
Это базовая структура, которая у меня есть в настоящее время (я могу предоставить детали реализации, если вы действительно хотите):
// СуффиксTrie.java
public class SuffixTrie {
private SuffixTrieNode root = new SuffixTrieNode();
// implementation of insertions into tree etc..
public static void main(String[] args) throws FileNotFoundException {
String fileName = "Frankenstein.txt";
SuffixTrie st = readInFromFile(fileName);
String[] ss = {"without","hideous", "the only", "onster", ", the", "ngeuhhh"};
for (String s: ss) {
SuffixTrieNode sn = st.get(s);
System.out.println("[" + s + "]: " + sn);
}
}
}
Каждый узел:
// SuffixTrieNode.java
public class SuffixTrieNode {
private char label; // Indicates the letter for this node
private boolean isTerminal = false;
private SuffixTrieData data;
private HashSet<SuffixTrieNode> children;
// Inserting adds more SuffixTrieNodes to the children of the node
Данные, хранящиеся в каждом узле:
public class SuffixTrieData {
private ArrayList<Pair> startIndexes = new ArrayList<Pair>();
public SuffixTrieData(int sentence, int index){
addStartIndex(sentence, index);
}
public class Pair{
public int sentence;
public int index;
public Pair(int sentence, int index){
this.sentence = sentence;
this.index = index;
}
}
}
Ошибка, которую я получаю:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.ArrayList.<init>(Unknown Source)
at java.util.ArrayList.<init>(Unknown Source)
at SuffixTrieData.<init>(SuffixTrieData.java:7)
at SuffixTrie.insert(SuffixTrie.java:20)
at SuffixTrie.insert(SuffixTrie.java:11)
at SuffixTrie.readInFromFile(SuffixTrie.java:77)
at SuffixTrie.main(SuffixTrie.java:89)
Однако он отлично работает для небольших текстовых файлов, и они впервые дали студентам это задание, поэтому преподаватели в любом случае не знают, выполнимо ли это с помощью суффикса.
private List<Pair> startIndexes = new ArrayList<Pair>(1);
аналогично тому, как вы можете уменьшить начальную емкость набора. - person Peter Lawrey   schedule 04.09.2011