词频统计

时间:2011-12-30 15:49:44

标签: c++ c word-frequency

在面试前,我遇到了这样的问题:

如果一个字符串由单个空格分隔的单词组成,则按照它们出现在字符串中的次数按降序打印出单词。

例如,输入字符串“a b b”将生成以下输出:

b : 2
a : 1

首先,我要说输入字符串是由单字母单词还是多字母单词组成还不是很清楚。如果是前者,那可能很简单。

以下是我的想法:

int c[26] = {0};
char *pIn = strIn;

while (*pIn != 0 && *pIn != ' ')
{
    ++c[*pIn];
    ++pIn;
}

/* how to sort the array c[26] and remember the original index? */

我可以得到输入字符串中每个单字母单词的频率统计数据,我可以对其进行排序(使用QuickSort或其他)。但是在对count数组进行排序之后,如何获得与计数相关联的单字母单词,以便我可以在以后将它们打印出来?

如果输入字符串由多个字母组成,我打算使用map<const char *, int>来跟踪频率。但同样,如何对地图的键值对进行排序?

问题在于C或C ++,欢迎提出任何建议。

谢谢!

3 个答案:

答案 0 :(得分:1)

我会使用std::map<std::string, int>来存储单词及其计数。然后我会用这个来得到这些词:

while(std::cin >> word) {
    // increment map's count for that word
}

最后,你只需要弄清楚如何按频率顺序打印它们,我会把它作为练习留给你。

答案 1 :(得分:0)

假设你只需要26个选项,你肯定是错的,因为你的雇主也想要允许多个字符的单词(甚至可能是数字?)。

这意味着你需要一个长度可变的数组。我强烈建议使用矢量,或者更好的是使用地图。

要查找字符串中的字符序列,请找到当前位置(从0开始)和下一个空格的位置。那就是这个词。将当前位置设置为空格并再次执行。继续重复这个,直到你结束。

通过使用地图,您已经可以使用单词/计数。

如果您申请的工作需要大学技能,我强烈建议您通过添加某种散列函数来优化地图。但是,从问题的难度来看,我认为事实并非如此。

答案 2 :(得分:0)

采用C语言案例:

我喜欢蛮力,直率的算法,所以我会这样做:

  1. 对输入字符串进行标记,以提供未排序的单词数组。实际上,我必须实际移动每个单词(因为每个单词的长度可变);我想我需要一个char *数组,我将它用作qsort()的arg。

  2. qsort()(降序)那个单词数组。 (在qsort()的COMPAR函数中,假设较大的单词是较小的单词,以便数组获得降序排序。)

  3. 3.A。浏览现在排序的数组,查找相同单词的子数组。一个子阵列的结束,以及下一个的开始,由我看到的第一个不相同的单词表示。 3.B.当我到达子阵列的末尾(或排序数组的末尾)时,我知道(1)该单词和(2)子阵列中相同单词的数量。

    编辑新的第4步:保存,在另一个数组(称为array2)中,char *到子目标中的单词以及子数组中相同单词的计数。

    1. 当排序数组中没有更多单词时,我就完成了。是时候打印了。

    2. qsort()array2按字频率。

    3. 通过array2,打印每个单词及其频率。

    4. 我已经完成了!我们去吃午饭吧。