按值对未知键的地图进行排序

时间:2014-04-22 10:59:20

标签: c++ algorithm sorting map

我有以下风格的地图:

mapa["01"]=2
mapa["111"]=3

显示每个子字符串在文本中出现的频率(文本由1和0组成)。

现在让我们说我想输出10个最常用的子字符串,我需要遍历地图中的所有键并获得具有最大值的值(按值排序,降序)。我应该使用的任何伪代码或命令?

如果它对您有用,我正在处理this任务,我得到了所有的值,我只是不知道如何对它们进行排序。

2 个答案:

答案 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";
    }
}