不确定要使用哪种数据结构

时间:2015-10-01 08:25:10

标签: c++ data-structures

假设我有以下文字:

today was a good day and today was a sunny day. 

我把这个文本分成几行,用空格分隔,这是

Today

was

a

good

现在我使用矢量数据结构通过.size()简单计算文本中的单词数。那已经完成了。

但是,我还要检查一个单词是否出现不止一次,如果出现,多少次。在我的例子中,“今天”出现了两次。

我想存储“今天”并附加2 / x(取决于它出现在大文本中的频率)。现在,这不仅仅是针对“今天”,而是针对文本中的每一个字。我想查找一个单词出现的频率,附加一个计数器,然后按降序对它(单词+计数器)进行排序(这是另一回事,但是 现在不重要了。)

我不确定在这里使用哪种数据结构。也许是地图?但是我无法添加计数器来映射。

编辑:这是我到目前为止所做的:http://pastebin.com/JncR4kw9

4 个答案:

答案 0 :(得分:5)

你应该使用地图。事实上,您应该使用unordered_map

unordered_map<string,int>将为您提供一个哈希表,该表将使用字符串作为键,您可以扩充整数以保持计数。

unordered_map具有O(1)查找和插入O(logn)查找和插入map的优点。这是因为前者使用数组作为容器,而后者使用树的一些实现(我认为是红黑)。

unordered_map的唯一缺点是,如其名称所述,您不能以词法顺序迭代所有元素。从上面的结构解释中可以清楚地看出这一点。但是,您似乎不需要这样的遍历,因此它不应该是一个问题。

unordered_map<string,int> mymap;
mymap[word]++; // will increment the counter associated with the count of a word.

答案 1 :(得分:2)

为什么不使用两个数据结构?你现在拥有的矢量和一个map,使用字符串作为键,一个整数作为数据,然后是文本中找到单词的次数。

答案 2 :(得分:0)

按字母顺序对矢量进行排序。 扫描它并将每个单词与后面的单词进行比较,直到找到不同的单词和儿子。

a, a, and, day, day, sunny, today, today, was, was
2     1    2         1      2             2

答案 3 :(得分:0)

更好的选择是Radix Tree,https://en.wikipedia.org/wiki/Radix_tree 这对内存有效,并且在大文本输入的情况下,它将比其他数据结构表现更好。

可以将单词的频率存储在树的节点中。此外,它还将获得&#34;参考地点[对于任何文本文件]&#34;太