我有以下风格的地图:
mapa["01"]=2
mapa["111"]=3
显示每个子字符串在文本中出现的频率(文本由1和0组成)。
现在让我们说我想输出10个最常用的子字符串,我需要遍历地图中的所有键并获得具有最大值的值(按值排序,降序)。我应该使用的任何伪代码或命令?
如果它对您有用,我正在处理this任务,我得到了所有的值,我只是不知道如何对它们进行排序。
答案 0 :(得分:1)
您基本上需要使用比较器
实现一些top-k过滤算法x < y if and only if mapa[x] < mapa[y]
线程Store the largest 5000 numbers from a stream of numbers中包含有效选择列表中的前k个:
基本思想是创建一个min heap,它始终存储到目前为止遇到的前k个元素。完成后,堆中包含流中的前K个元素。
另一种方法是使用选择算法来找到第10个最大的元素,并生成比它大的所有元素(如果有重复的话,可以多做一些工作)。
答案 1 :(得分:0)
看到这个duplicate,你基本上迭代地图并在值上使用std :: partial_sort。
typedef std::pair<std::string, int> mypair;
struct IntCmp {
bool operator()(const mypair &lhs, const mypair &rhs) {
return lhs.second > rhs.second;
}
};
void print10(const std::map<std::string,int> &mymap) {
std::vector<mypair> myvec(mymap.begin(), mymap.end());
assert(myvec.size() >= 10);
std::partial_sort(myvec.begin(), myvec.begin() + 10, myvec.end(), IntCmp());
for (int i = 0; i < 10; ++i) {
std::cout << i << ": " << myvec[i].first
<< "-> " << myvec[i].second << "\n";
}
}