【问题标题】:Efficient algorithm to find frequency of words, max word frequency and total word count查找词频、最大词频和总词数的高效算法
【发布时间】:2016-01-04 11:46:41
【问题描述】:

我正在尝试查找每个单词在文件的某个部分中出现的频率以及该部分的总字数。 例如如果有一个文件:file.txt:

这是一个文件部分,它是文件的一部分。
# 这是另一个文件部分,它是由哈希分隔的同一文件的一部分。

我希望以有效的方式找到每个单词的频率,哪个单词在每个部分中具有最大频率和总字数。这样:

在第 1 节中:This-1;是-2;一个-1;文件-2;第 1 节;其中-1;第1部分;的-1; -1|总字数:11|频率最高的词:is,file
在第 2 节:This-1;是-2;另一个-1;文件-2;第 1 节;其中-1;第1部分;的-1; -1;相同-1;通过-1;哈希-1;|总字数:15|频率最高的词:is,file

到目前为止,我已经提出了一个循环,它遍历每个单词,增加总字数,然后将每个单词放入具有每个单词频率的键/值对中。我不知道最大频率。有没有我可以尝试使用的有效算法?

我希望在 Java 中这样做。所以,我正在考虑使用 HashMaps,但欢迎任何更好的方法。

谢谢:)

【问题讨论】:

  • 听起来像是应用 MapReduce 的完美场景:hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html;对于频率,您可以简单地使用wordCountOfWorkxyz / totalWords
  • 这看起来不错。有没有一种方法可以在 MapReduce 中找到具有最大频率的键?总字数,我想我可以使用普通的迭代变量找到。
  • 你不必为这个任务使用 MapReduce,我只是建议它,因为这是一个常见的场景,有时人们喜欢学习新事物。只要文件不是很大,您就可以简单地坚持您的算法。有趣的是,如果在整个部分上计算最大频率,它甚至都无关紧要。出现次数最多的词也将出现最高频率。
  • 您看过 SO 上已经提供的解决方案了吗? stackoverflow.com/search?q=[java]+frequency+words 如果是这样。
  • @tbrown 哦,当然。我的文件不是很大。我一直在寻找可能需要 O(n) 时间来完成所有事情的东西,包括标记化、具有频率的哈希图、总字数以及 划分为部分

标签: java algorithm sorting search


【解决方案1】:

您可以在更新每个单词时轻松跟踪当前最大值。例如,每个部分的循环:

Initialize HashMap of Words
maxWord = null  // word with current max count
while not end of section
    get word
    if word in Words
        increment count of word in HashMap
    else
        add to Words with count of 1
    if maxWord == null || Words[word].Count > Words[maxWord].Count
        maxWord = word
end while

当你完成该部分的处理后,你就有了所有单词的频率,maxWord 包含了计数最多的单词。

整个算法是O(n)。您可以在文件的单次传递中完成。

不过,要简单得多,只需构建您的 HashMap 单词,然后在每个部分的末尾,依次浏览它以挑选出具有最大计数的单词。这也被认为是 O(n)。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多