我想創建一個程序來計算文件中某個單詞的唯一出現次數,然後按字母順序顯示它們的計數。最有效的結構來計算文件中的唯一字[C++]
關鍵是要以最快和最有效的方式做到這一點。
請記住,我使用C++編寫代碼,但我並不反對純粹的理論答案。
有什麼建議嗎?
我想創建一個程序來計算文件中某個單詞的唯一出現次數,然後按字母順序顯示它們的計數。最有效的結構來計算文件中的唯一字[C++]
關鍵是要以最快和最有效的方式做到這一點。
請記住,我使用C++編寫代碼,但我並不反對純粹的理論答案。
有什麼建議嗎?
我認爲你應該對一些「一次性使用的單詞」和「禁止的單詞:使用兩次或更多次」使用2個std :: set。
所以你要處理的是一個詞:cur_word。如果forbidden_words包含它,則忽略它,否則檢查allowed_words是否包含,將其從中刪除並添加到forbidden_words中,否則只需將其添加到allowed_words中即可。
這裏是一個使用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;
}
如果鍵不存在,運算符[]()'會插入一個默認初始化的值(在本例中爲'0'),所以沒有理由事先用'find()'來檢查。另外,'unordered_map'可能會更快。 – 2013-03-13 14:54:08
已更新。如果可以的話,同意哈希映射會更好。 – andre 2013-03-13 14:57:55
你需要在最後遍歷它們,而不是像你正在經歷的那樣。 – 2013-03-13 15:01:32
std::unordered_set
可以快於std::set
(特別是如果該文件是大)。
雖然這不太可能會產生太大的差別 - 除非您寫得非常糟糕,否則這項工作將會嚴重影響I/O,所以大部分工作都應該加快I/O速度。
如何從那裏繼續可能取決於目標操作系統。對於Linux,快速讀取文件大部分等於mmap
。對於Windows,您通常希望避免內存映射文件,並使用ReadFile
和FILE_FLAG_NO_BUFFERING
標誌。
'std :: map word_count' –
andre
2013-03-13 14:45:26
http://www.cplusplus.com/forum/beginner/38629/ – Neppinger 2013-03-13 14:48:34
到目前爲止你做了什麼?我無法看到任何比某種地圖更好的解決方案,並從文件中讀取每個單詞並在地圖中累積匹配的位置。 – 2013-03-13 14:50:03