统计英文电子书中出现次数最多的K个单词。
使用map和priority_queue实现,十分简洁有效。
1.使用map<string,int>保存每种单词的数量;
2.使用priority_queue保存最大的K个数(注意相当于小顶堆,使用">"操作符)
priority_queue<pair<int,string>,vector<pair<int,string>>,greater<pair<int,string>>> queueK
代码:
#include <iostream> #include <vector> #include <fstream> #include <string> #include <map> #include <queue> #include <ctime> using namespace std; string filename="D:/Twilight.txt"; void topK(const int &K) { double t=clock(); ifstream infile; infile.open(filename); if (!infile) cout<<"can not open file"<<endl; string s; map<string,int>wordcount; while(true) { infile>>s; if(infile.eof()) break; wordcount[s]++; } cout<<"单词种类:"<<wordcount.size()<<endl; //优先队列使用小顶堆,排在前面的数量少,使用">"; priority_queue<pair<int,string>,vector<pair<int,string>>,greater<pair<int,string>>> queueK; for (map<string,int>::iterator iter=wordcount.begin(); iter!=wordcount.end(); iter++) { queueK.push(make_pair(iter->second,iter->first)); if(queueK.size()>K) queueK.pop(); } pair<int,string>tmp; while (!queueK.empty()) { tmp=queueK.top(); queueK.pop(); cout<<tmp.second<<"\t"<<tmp.first<<endl; } cout<<"< Elapsed Time: "<<(clock()-t)/CLOCKS_PER_SEC<<" >"<<endl; } int main() { int k=0; while (true) { cout<<"PUT IN K: "; cin>>k; if(k==0)break; topK(k); } }
附:统计文本《Twilight》