按值对具有未知键的贴图进行排序

Sorting a map with unknown keys by value

本文关键字:排序 未知      更新时间:2023-10-16

我有一个以下样式的映射:

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

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

现在假设我想输出10个最常用的子字符串,我需要遍历映射中的所有键,并获得值最大的键(按值排序,降序)。我应该使用什么伪代码或命令?

如果这对你有用的话,我正在做这项任务,我得到了所有的值,我只是不知道如何排序。

您基本上需要使用比较器来实现一些top-k滤波算法

x < y if and only if mapa[x] < mapa[y]

有效地从列表中选择前k个包含在线程中存储数字流中最大的5000个数字:

基本思想是创建一个最小堆,它总是存储迄今为止遇到的前k个元素。完成后,堆包含流中的前K个元素。

另一种选择是使用选择算法来找到第十大元素,并生成所有大于它的元素(如果有重复的元素,则需要更多的工作)。

看到这个重复,您基本上迭代映射并对值使用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";
    }
}