查找单词频率,最大单词频率和总单词数的高效算法

时间:2016-01-04 11:46:42

标签: java algorithm sorting search

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

  

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

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

  

在第1节:This-1;是-2; A-1;文件-2;部-1;其中-1;第1部分;的-1;在-1 |总字数:11 |具有最大频率的词:是,文件
  在第2节:This-1;是-2;另一个-1;文件-2;部-1;其中-1;第1部分;的-1;所述-1;相同-1;通过-1;散列-1; |总字数:15 |具有最大频率的单词:是,文件

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

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

谢谢:)

1 个答案:

答案 0 :(得分: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)。