各行にトークンを含む大きなテキスト ファイルがあります。各トークンの出現回数を数えてソートしたい。できれば組み込み関数と最短のコーディング (そしてもちろん最も効率的な) を使用して、C++ で効率的にそれを行うにはどうすればよいですか? 私はPythonでそれを行う方法を知っていますが、STLでunordered_mapを使用してそれを行う方法がわかりません.
質問する
309 次
2 に答える
3
unordered_mapアプローチを使用します。最も頻度の高いkトークンを選択するには、kがトークンの総数よりも小さいと仮定して、std::partial_sortを確認する必要があります。
ちなみに、++frequency_map[token]
(たとえば、frequency_mapがである場合std::unordered_map<std::string, long>
)C ++では完全に受け入れられますが、Pythonでの同等のものは、新しく表示されたトークンで爆発すると思います。
OK、どうぞ:
void most_frequent_k_tokens(istream& in, ostream& out, long k = 1) {
using mapT = std::unordered_map<string, long>;
using pairT = typename mapT::value_type;
mapT freq;
for (std::string token; in >> token; ) ++freq[token];
std::vector<pairT*> tmp;
for (auto& p : freq) tmp.push_back(&p);
auto lim = tmp.begin() + std::min<long>(k, tmp.size());
std::partial_sort(tmp.begin(), lim, tmp.end(),
[](pairT* a, pairT* b)->bool {
return a->second > b->second
|| (a->second == b->second && a->first < b->first);
});
for (auto it = tmp.begin(); it != lim; ++it)
out << (*it)->second << ' ' << (*it)->first << std::endl;
}
于 2012-10-05T02:02:10.030 に答える
0
C ++でファイルから行を読み取る方法を知っていると仮定すると、これは正しい方向へのプッシュになるはずです
std::string token = "token read from file";
std::unordered_map<std::string,int> map_of_tokens;
map_of_tokens[token] = map_of_tokens[token] + 1;
次に、それらをそのまま印刷できます(テスト用):
for ( auto i = map_of_tokens.begin(); i != map_of_tokens.end(); ++i ) {
std::cout << i->first << " : " << i->second << "\n";
}
于 2012-10-05T00:36:19.107 に答える