当前位置: 首页 > ds >正文

【C++算法】76.优先级队列_前 K 个高频单词

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:


题目链接:

692. 前 K 个高频单词


题目描述:

b49ba5a292da152e1da47abd59fc25ed


解法

利用堆来解决TopK问题

  1. 预处理一下原始的字符串数组,用一个哈希表统计一下每一个单词出现的频次。
  2. 创建一个大小为k的堆
    1. 频次:小根堆
    2. 字典序(频次相同的时候):大根堆
  3. 循环
    1. 让元素依次进堆
    2. 判断
  4. 提取结果

C++ 算法代码:

class Solution 
{// 定义类型别名,PSI表示<单词, 频次>对typedef pair<string, int> PSI;// 自定义比较器,用于优先队列中元素的排序struct cmp{bool operator()(const PSI& a, const PSI& b){// 如果两个单词出现频次相同if(a.second == b.second) {// 按字典序排列,较小的单词优先级较低// 注意:因为我们需要较大的字典序在堆顶,所以用< return a.first < b.first;}// 按频次排列,较大的频次优先级较低// 注意:这里使用>而不是<,是为了创建一个小根堆// 这样频次较小的元素会在堆顶return a.second > b.second;}};public:vector<string> topKFrequent(vector<string>& words, int k) {// 1. 统计每个单词的出现频次unordered_map<string, int> hash;for(auto& s : words) hash[s]++;// 2. 创建一个大小为k的小根堆// 这里的小根堆是按照我们自定义的比较器排序的// 频次低的在堆顶,频次相同则字典序大的在堆顶priority_queue<PSI, vector<PSI>, cmp> heap;// 3. 实现TopK的核心逻辑for(auto& psi : hash){heap.push(psi);  // 将当前单词及其频次加入堆// 如果堆大小超过k,弹出堆顶(频次最小的元素)// 这样堆始终保持k个频次最高的元素if(heap.size() > k) heap.pop();}// 4. 提取最终结果vector<string> ret(k);// 注意反向填充结果数组// 因为堆中的元素是按频次从小到大、频次相同则按字典序从大到小排列的// 我们需要从堆顶依次取出元素,反向填充到结果数组中// 这样最终结果就是按频次从大到小、频次相同则按字典序从小到大排列for(int i = k - 1; i >= 0; i--){ret[i] = heap.top().first;  // 取出堆顶元素(单词)heap.pop();                  // 弹出堆顶}return ret;  // 返回结果数组}
};
http://www.xdnf.cn/news/16744.html

相关文章:

  • 【VOS虚拟操作系统】未来之窗打包工具在前端资源优化中的应用与优势分析——仙盟创梦IDE
  • Java奖客富翁系统:注册登录抽奖全实现
  • 小程序视频播放,与父视图一致等样式设置
  • Python爬虫01_Requests第一血获取响应数据
  • 【Python】数据可视化之聚类图
  • logtrick 按位或最大的最小子数组长度
  • Apache Ignite 的对等类加载(Peer Class Loading, P2P Class Loading)机制
  • 快速了解逻辑回归
  • 6、微服务架构常用十种设计模式
  • PLC如何进行远程维护远程上下载程序?
  • QT项目 -仿QQ音乐的音乐播放器(第三节)
  • 基于dcmtk的dicom工具 第九章 以json文件或sqlite为数据源的worklist服务(附工程源码)
  • Qt 移动应用性能优化策略
  • 复现cacti的RCE(CVE-2022-46169)
  • TDengine 中 TDgpt 异常检测的机器学习算法
  • Leetcode——41. 缺失的第一个正数
  • 数学建模——非线性规划
  • 大文档免费翻译方法分享
  • 政策合规性前端设计:工业数据安全的可视化技术规范与落地实践
  • C语言进阶(指针2.函数指针和指针函数,二级指针,指针数组和数组指针,void*指针)
  • 数据结构 排序(2)---选择排序
  • 使用鼠标在Canvas上绘制矩形
  • PDF转Word免费工具!批量处理PDF压缩,合并, OCR识别, 去水印, 签名等全功能详解
  • Shader开发(四)计算机图形学中的颜色定义
  • Java 大视界 -- Java 大数据机器学习模型在金融信用评级模型优化与信用风险动态管理中的应用(371)
  • Day23-二叉树的层序遍历(广度优先搜素)
  • [明道云]-基础教学2-工作表字段 vs 控件:选哪种?
  • Redis 跨主机连接超时分析:从网络波动到架构优化
  • 个人健康管理小程序(消息订阅、Echarts图形化分析)
  • TGD第八篇:二维应用——图像边缘检测