使用C++优先队列(priority_queue)解决Top K

作者: ledao | 来源:发表于2019-02-12 16:50 被阅读2次

背景

在同构的n个数据中取Top K的最大值或者最小值有很多方法,例如:

  • 排序后,取前K个或者后K个,算法复杂度为nlog(n);
  • 维护大小为K的最大(小)堆,最后取堆中的元素,算法 复杂度为nlog(k)。
    当n很大时,第二种方法可以得到显著的速度提升。本文以C++保准库提供的priotiry_queue为基础,实现基于堆的Top K算法。

步骤

  1. 创建有限队列
//自定义结构的比较器,这里为优先级队列实现一个Great比较器,使优先级队列元素从小到大跑得了排序
struct cmpPairSecondFloatGreat{
    bool operator() (const std::pair<int32_t, float>&a, const std::pair<int32_t, float>& b) {
        return a.second > b.second;
    }
};
//定义优先级队列,队列实现最小堆,即top为最小值。
std::priority_queue<std::pair<int32_t, float>, std::vector<std::pair<int32_t, float>>, cmpPairSecondFloatGreat> noise_words;

以取最大Top K为例,将自定义比较器给优先级队列。

  1. 更新优先级队列中的值
for (int i = 0; i < 100000000; i++) {
    float num = float(rand());
    if (pq.size() < 3){ //以Top 3为例
      pq.push(make_pair(0, num));
    } else {
      if( num < pq.top().second) {
        continue;
      } else {
        pq.pop(); // 如果当前值比待插入值大,则将队头元素删除,将当前值插入队列中。
        pq.push(make_pair(1, num));
      }
    }
    vecs.push_back(make_pair(0, num));
  }
  1. 获取Top K的值
    取出有限队列中的值,即得到Top K的值。
while (!pq.empty()) {
    cout << pq.top().second << " ";
    pq.pop();
  }

总结

通过有限队列内部实现的堆算法,手动控制有限队列的大小,即可模拟实现基于最大(小)堆的Top K算法。

相关文章

  • 使用C++优先队列(priority_queue)解决Top K

    背景 在同构的n个数据中取Top K的最大值或者最小值有很多方法,例如: 排序后,取前K个或者后K个,算法复杂度为...

  • C++ STL priority_queue 使用说明

    说明 优先队列std::priority_queue 可用于构造堆。 比如:大顶堆:priority_queue ...

  • 堆 - 堆的应用

    堆有三个典型的应用场景:实现优先队列、求 Top K 、求中位数 实现优先队列 优先队列:队列的性质是先进先出,但...

  • STL容器(3)-priority_queue类

    STL容器(3)-priority_queue类 优先级队列 优先级队列本质就是一个堆,在C语言中可以使用数组来实...

  • priority_queue

    priority_queue 优先队列,其底层是用堆来实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那...

  • priority_queue

    priority_queue又称为优先队列,其底层是用堆来进行实现的。在优先队列中,队首元素一定是当前队列中优先级...

  • priority_queue 优先级队列的使用

    priority_queue 优先级队列是一个拥有权值概念的单向队列 queue,在这个队列中,所有元素是按优先级...

  • Objective-C封装std::priority_queue

    原文地址:Objective-C封装std::priority_queue<>实现优先队列最近项目中需要用到优先队...

  • C++ 优先队列 std::priority_queue

    定义 提供常数时间的最优先元素的查找(当为int时,默认为最大),对数代价的插入与弹出。第一个参数,表示优先队列中...

  • CodeForces - 681C 【优先队列】

    传送门优先队列在语法(推入,删除)上与普通队列一样,不同在于声明时要这样:priority_queue ,grea...

网友评论

    本文标题:使用C++优先队列(priority_queue)解决Top K

    本文链接:https://www.haomeiwen.com/subject/gwykeqtx.html