2013-03-13 50 views
-1

我想創建一個程序來計算文件中某個單詞的唯一出現次數,然後按字母順序顯示它們的計數。最有效的結構來計算文件中的唯一字[C++]

關鍵是要以最快和最有效的方式做到這一點。

請記住,我使用C++編寫代碼,但我並不反對純粹的理論答案。

有什麼建議嗎?

+1

'std :: map word_count' – andre 2013-03-13 14:45:26

+0

http://www.cplusplus.com/forum/beginner/38629/ – Neppinger 2013-03-13 14:48:34

+0

到目前爲止你做了什麼?我無法看到任何比某種地圖更好的解決方案,並從文件中讀取每個單詞並在地圖中累積匹配的位置。 – 2013-03-13 14:50:03

回答

0

我認爲你應該對一些「一次性使用的單詞」和「禁止的單詞:使用兩次或更多次」使用2個std :: set。

所以你要處理的是一個詞:cur_word。如果forbidden_​​words包含它,則忽略它,否則檢查allowed_words是否包含,將其從中刪除並添加到forbidden_​​words中,否則只需將其添加到allowed_words中即可。

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'),所以沒有理由事先用'find()'來檢查。另外,'unordered_map'可能會更快。 – 2013-03-13 14:54:08

+0

已更新。如果可以的話,同意哈希映射會更好。 – andre 2013-03-13 14:57:55

+0

你需要在最後遍歷它們,而不是像你正在經歷的那樣。 – 2013-03-13 15:01:32

0

std::unordered_set可以快於std::set(特別是如果該文件是大)。

雖然這不太可能會產生太大的差別 - 除非您寫得非常糟糕,否則這項工作將會嚴重影響I/O,所以大部分工作都應該加快I/O速度。

如何從那裏繼續可能取決於目標操作系統。對於Linux,快速讀取文件大部分等於mmap。對於Windows,您通常希望避免內存映射文件,並使用ReadFileFILE_FLAG_NO_BUFFERING標誌。

相關問題