有效地使用带阵列的KMP来计算字频数

时间:2012-10-20 10:53:03

标签: c++ c

我想从文章中计算词频。

我的想法是先创建一个struct array

 struct{
       char[WORD_SIZE]
 }data[MAX_WORD_NUMBER];

然后读取每个字符,然后通过

确定
isalpha();

然后按

转换为小写
tolower();

然后在每个结构中存储一个单词。

然后为每个单词制作失败函数,

然后通过调用它来测试每个单词。

1.但我不知道如何计算重复导致的频率。

(我想我每次阅读和插入一个单词时都可以比较它,但它是如此无效,是否有更有效的方法?)

2.我认为我的方法调用功能太多了。

如何更有效地使用KMP?

2 个答案:

答案 0 :(得分:3)

您使用C或C ++编程?你用两者标记了你的问题。

假设您正在使用C ++,那么您将使用std::map更好地计算您的单词。像这样的东西

#include <map>
#include <string>

std::map<std::string, int> data;

std::string word;

data[word] = 0; // set word count to zero
data[word]++; // increment word count

// print out all the word counts
for (std::map<std::string, int>::iterator i = data.begin();
  i != data.end(); ++i)
{
  cout << "word " << i->first << " occurs " << i->second << "times\n";
}

如果您为作业选择合适的工具,此任务将如此更加容易。当然,如果你使用C编程,那么这一切都无济于事。

答案 1 :(得分:1)

如果您打算在C中执行此操作,请扩展您的结构:

struct {
    char[WORD_SIZE];
    int count;
} data[MAX_WORD_NUMBER];

然后,只要在此结构数组中存储新单词,也会将相应的count设置为0。

然后,如果您发现某个单词已经在数组中,请增加相应的count

在程序结束时打印计数。