【问题标题】:Implemet trie in Java in a memory efficient manner以内存高效的方式在 Java 中实现 trie
【发布时间】:2017-03-05 12:49:30
【问题描述】:

我必须阅读一个 10 GB 的文件并找出文件中最常用的短语。 我正在使用扫描仪分块读取文件并将短语存储在 特里数据结构。 稍后我将搜索这些短语以更新它们的计数,因此使用 trie 数据结构进行有效搜索。我已经实现了 Trie 在java中使用Hashmap如下所示。

class TrieNode {
        char data;
        Map<Character, TrieNode> children = new HashMap<>();
        boolean isLeafNode;
        int positionMinHeap = -1;
        int frequency;

        TrieNode() {

        }

        TrieNode(char data) {
            this.data = data;
        }

    }

但是这个解决方案占用了大量的堆空间。如果文件中的所有短语都是不同的,那么 Trie 会占用大量空间。有没有其他方法可以以节省内存的方式实现 Trie?

【问题讨论】:

标签: data-structures heap-memory trie


【解决方案1】:

如果您不惧怕一点点 C++ 和 JNI 绑定,那么您将有更多选择来优化解决方案。我建议尝试 marisa-trie:

https://github.com/s-yata/marisa-trie/tree/master

不久前我尝试过其他几个库(不幸的是,我现在不记得其他库了)并且对于 我的数据集,marisa-trie 在性能和内存使用之间取得了很好的平衡与其他 C++ trie 库相比。

您还可以从内存映射 IO 接口中受益,因为当您的数据变大时(当然会牺牲一些性能)。

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 2015-06-26
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2019-11-10
    • 2012-07-20
    相关资源
    最近更新 更多