最有效的结构来计算文件中的唯一单词[C ++]

时间:2013-03-13 14:44:09

标签: c++ performance sorting data-structures word-count

我正在尝试创建一个程序来计算文件中单词的唯一出现次数,然后按字母顺序显示它们的计数。

关键是要以最快,最有效的方式做到这一点。

尝试并记住我使用C ++编写代码,但我并不反对纯粹的理论答案。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

以下是使用cin的示例。

#include <iostream>
#include <string>
#include <map>
using namespace std;

int main() {
    string word;
    std::map<std::string, int> word_count;

    while (std::getline(cin, word, ' ')) {
        word_count[word]++;
    }

    typedef std::map<std::string, int>::iterator iter;
    iter end = word_count.end();
    for(iter it = word_count.begin(); it != end; ++it) {
        cout << it->first << ", count= " << it->second << endl;
    }

    return 0;
}

答案 1 :(得分:0)

我认为你应该使用2 std :: set的一些“1次使用的单词”和“禁止的单词:使用两次或更多次”。

所以你要处理一个词:cur_word。如果forbidden_​​words包含它,则忽略它,否则检查allowed_words是否包含,从中删除它并添加到forbidden_​​words,否则只需将其添加到allowed_words。

答案 2 :(得分:0)

std::unordered_set可能比std::set更快(特别是如果文件很大)。

虽然这不太可能产生太大的影响 - 除非你写得非常糟糕,否则这项工作将受到严重的I / O限制,所以你的大部分工作都应该加速I / O.

如何从那里开始可能取决于目标操作系统。对于Linux,快速文件读取大多等同于mmap。对于Windows,您通常希望避免使用内存映射文件,并将ReadFileFILE_FLAG_NO_BUFFERING标志一起使用。