0

我正在使用 C++ 从文章算法中提取主题。首先,我编写了代码来删除文章、命题等单词。

然后将其余单词存储在一个 char 数组中:char *excluded_string[50] = { 0 };

    while ((NULL != word) && (50 > i)) {
    ch[i] = strdup(word);
    excluded_string[j]=strdup(word);
    word = strtok(NULL, " ");
    skp = BoyerMoore_skip(ch[i], strlen(ch[i]) );
        if(skp != NULL)
        {
            i++;
            continue;
        }
j++;

skp当 ch[i] 不是articles 或类似的caregory 时为NULL。此功能检查任何单词是否属于文章或提案...等

现在最后 ex..[] 包含一组必需的单词。现在我想在这个数组中出现每个单词,然后是出现次数最多的单词。如果多于一个。

我应该使用什么逻辑?

我的想法是:采用二维数组。第一列将有单词。第二列我可以用来存储计数值。

然后对于每个将该单词发送到数组的单词以及该单词的每次出现都会增加计数值并将该单词的计数值存储在第二列中。

但这既昂贵又复杂。

还有什么想法吗?

4

1 回答 1

0

如果您希望计算数组中每个单词的出现次数,那么您只能做 O(n) (即遍历数组)。但是,如果您尝试将单词计数存储在二维数组中,那么您还必须每次都进行查找以查看单词是否已经存在,这很快就会变成 O(n^2)。

诀窍是使用哈希表进行查找。当您逐步浏览单词列表时,您会增加哈希表中的正确条目。每个查找应该是 O(1),所以只要有足够多的词来抵消散列算法的复杂性和内存使用,它应该是有效的(即,如果你处理少于 10 个词,请不要打扰, 说)。

然后,完成后,您只需遍历哈希表中的条目即可找到最大值。事实上,我可能会在计算单词时跟踪这一点,所以之后不需要这样做(“如果 thisWordCount 大于 currentMaximumCount 则 currentMaximum = thisWord”)。

我相信标准 C++unordered_map类型应该可以满足您的需求。这里有一个例子。

于 2013-08-21T10:34:39.483 回答