繁体   English   中英

使用Java中的自平衡不可变二进制搜索树从巨大的文本文件中查找词频?

[英]Find word frequency from huge text file using self-balancing immutable Binary Search Tree in Java?

我试图了解如何实现BST,该BST将读取巨大的文本文件并在Java中存储每个单词的出现频率? 我还试图使其以多线程方式工作,所以我相信我也必须使其具有线程安全性!

编辑:谢谢您的回答。 但是我正在寻找Java代码,其中我们在不使用库的情况下构造BST以及添加上述功能。

只需使用从String到AtomicIntegerLongAdderConcurrentMap LongAdder 第一次找到时添加单词,然后增加整数。 在Java 8中,您可以使用computeIfAbsent作为1-liner来执行此操作,或者在较早的版本中,可以使用putIfAbsent 无论哪种情况,最好都是先通过get调用检查count对象是否已经存在,因为可以修改映射的方法比较慢-即使它们没有添加到映射中。 如果初始快速路径get()返回任何现有元素,则继续进行...ifAbsent调用:

    for (String word : words) {
        AtomicInteger count = chm.get(word);
        if (count == null) {
            if ((count = chm.putIfAbsent(word, new AtomicInteger(1))) == null) {
                continue;
            }
        }
        count.incrementAndGet();
    }

这将是快速且并行的。 您可以在顶层将文件拆分为多个块,然后在不同的线程上处理每个块。

那就是如果您坚持使用共享结构进行计数。 让每个线程将其计数保存在私有HashMap ,然后通过对映射求和来减少每个线程的结果,可能会更快一些。

也许您应该将文件拆分为多个块,使用非线程安全算法在不同线程上处理每个块,然后合并结果。 您将不会遭受同步惩罚。 或仅使用单线程导致瓶颈不是处理器而是硬盘。

根据定义,自平衡树不是一成不变的。

您可以从此列表中查找AVL树或另一棵

但是,我建议另一种方法:使用Trie来存储单词。 它会节省很多空间,并且比二叉搜索树快得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM