Ich muss eine 10 GB-Datei lesen und herausfinden, die häufigsten Sätze in der Datei. Ich lese die Datei in Chunks mit einem Scanner und speichert die Phrasen in einer Trie Datenstruktur. Ich werde die Sätze später durchsuchen, um ihre Zählung zu aktualisieren und habe daher die Trie-Datenstruktur für eine effiziente Suche verwendet. Ich habe die Trie mit Hashmap in Java implementiert, wie unten gezeigt.Implementieren Sie Trie in Java auf eine speichereffiziente Weise
class TrieNode {
char data;
Map<Character, TrieNode> children = new HashMap<>();
boolean isLeafNode;
int positionMinHeap = -1;
int frequency;
TrieNode() {
}
TrieNode(char data) {
this.data = data;
}
}
Aber diese Lösung braucht viel Platz im Heap. Und wenn alle Phrasen in der Datei unterschiedlich sind, würde die Trie sehr viel Speicherplatz beanspruchen. Gibt es eine andere Möglichkeit, wie ich Trie auf speichereffiziente Weise implementieren kann?
Ich würde einen top-k [Stream Zusammenfassung] (http://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf) Algorithmus verwenden. Verwenden Sie z. B. einen CountMinSketch, um Frequenzen zu verfolgen, wobei nur der größte k-Speicher im Speicher beibehalten und ersetzt wird, wenn höhere Frequenzen erkannt werden. –
Wie wäre es mit einer Radix-Tree-Implementierung? https://en.wikipedia.org/wiki/Radix_tree –