假设我有以下文字:
today was a good day and today was a sunny day.
我把这个文本分成几行,用空格分隔,这是
Today
was
a
good
等
现在我使用矢量数据结构通过.size()简单计算文本中的单词数。那已经完成了。
但是,我还要检查一个单词是否出现不止一次,如果出现,多少次。在我的例子中,“今天”出现了两次。
我想存储“今天”并附加2 / x(取决于它出现在大文本中的频率)。现在,这不仅仅是针对“今天”,而是针对文本中的每一个字。我想查找一个单词出现的频率,附加一个计数器,然后按降序对它(单词+计数器)进行排序(这是另一回事,但是 现在不重要了。)
我不确定在这里使用哪种数据结构。也许是地图?但是我无法添加计数器来映射。
编辑:这是我到目前为止所做的:http://pastebin.com/JncR4kw9
答案 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;太