Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找前K个频繁词_C++_Algorithm - Fatal编程技术网

C++ 查找前K个频繁词

C++ 查找前K个频繁词,c++,algorithm,C++,Algorithm,我正在尝试解决Leetcode网站上的一个问题- 给定一个非空的单词列表,返回k个最频繁的元素。 你的答案应该按频率从高到低排序。如果两个单词的频率相同,那么字母顺序较低的单词排在第一位。例如:如果输入是:[“the”,“day”,“is”,“sunny”,“the”,“the”,“the”,“the”,“sunny”,“is”,“is”],k=4,那么输出应该是:[“the”,“is”,“sunny”,“day”] 其中一个经过投票表决的解决方案如下所示: class Solution { p

我正在尝试解决Leetcode网站上的一个问题-

给定一个非空的单词列表,返回k个最频繁的元素。
你的答案应该按频率从高到低排序。如果两个单词的频率相同,那么字母顺序较低的单词排在第一位。例如:如果输入是:[“the”,“day”,“is”,“sunny”,“the”,“the”,“the”,“the”,“sunny”,“is”,“is”],k=4,那么输出应该是:[“the”,“is”,“sunny”,“day”]

其中一个经过投票表决的解决方案如下所示:

class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        unordered_map<string,int> dict;
        for(const string& s:words) dict[s]++;

        priority_queue<pair<string,int>, vector<pair<string,int>>, Comp> pq;
        for(const auto& pa:dict) {
            pq.push(pa);
            if(pq.size()>k) pq.pop();
        }    

        vector<string> result;
        while(!pq.empty()) {
            result.push_back(pq.top().first);
            pq.pop();
        }
        reverse(result.begin(),result.end());    
        return result;    
    }
private:
    struct Comp {
        Comp() {}
        ~Comp() {}
        bool operator()(const pair<string,int>& a, const pair<string,int>& b) {
            return a.second>b.second || (a.second==b.second && a.first<b.first);
        }
    };

};
类解决方案{
公众:
向量topKFrequent(向量和单词,int k){
无序的地图记录;
对于(常量字符串&s:words)dict[s]++;
优先级队列pq;
用于(const auto&pa:dict){
电能质量推力(pa);
如果(pq.size()>k)pq.pop();
}    
矢量结果;
而(!pq.empty()){
结果。向后推(pq.top()。首先);
pq.pop();
}
反向(result.begin(),result.end());
返回结果;
}
私人:
结构组件{
Comp(){}
~Comp(){}
布尔运算符()(常数对&a、常数对&b){
返回a.second>b.second | |(a.second==b.second&&a.firstk
,we
pop()
-这不正确吗?因为在这种情况下,我们正在丢失最高频率的元素?我认为是这样,因为根据比较器,频率较高的元素(或在频率相同的情况下,按字母顺序较小的元素)在优先级队列的顶部插入
  • 在优先级队列的情况下,当我们实现自己的比较器时,我们必须传递第二个参数(表示要使用的容器),但当我们使用默认比较器时,这不是必需的-为什么?我的意思是,不能根据我要存储的值的类型自动推断默认容器类型吗(第一个参数,在本例中为
  • pq.push(pa);
    的情况下,
    pa
    的具体类型是什么?我想知道,因为
    pq
    包含
    向量
    ,但是
    dict
    只包含
    字符串
    (映射到它们在
    int
    中的频率)。如何使用
    auto
    自动将
    字符串
    键映射到其
    int
    频率,以便插入优先级队列
  • 很抱歉问了这么长的问题。谢谢你的帮助

  • 您并没有真正取出频率最高的元素,因为排序的元素被反转到优先级队列中。实际上,在末尾有一个反向调用,以按正确的顺序输出元素。请注意,文档中已经明确说明了这一点
  • 请注意,Compare参数的定义使其返回true 如果它的第一个参数在弱 排序。但是因为优先级队列输出最大的元素 首先,“在前面”的元素实际上是最后输出的 是的,队列的前面包含“last”元素,根据 由比较强加的弱序

  • pa
    的类型是在
    unordered\u map::value\u type
    中指定的类型,即
    std::pair
    。 实际上,
    无序映射::值类型
    的每个元素都是
    std::pair
    的类型定义,并且由于
    优先级队列
    存储
    std::pair
    ,因此不会出现奇怪的情况

  • 希望这能有所帮助。

    只是一个旁注:这不是
    std::pair
    ,而是
    std::pair
    ;>关于(1)-返回语句是
    returna.second>b.second | |(a.second==b.second&&a.firstOk,那么你说的
    last
    意思是
    a
    (因为它比
    b
    )?好,明白了。谢谢!)