算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)
堆基础
堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值:
图片来源:这里
堆可以用数组存储,插入、删除会触发节点shift_down、shift_up操作,时间复杂度O(logn),可视化构建堆
堆是优先级队列(Priority queue)的底层数据结构,较常使用优先级队列而非直接使用堆处理问题。利用堆的性质可以方便地获取极值,例如 LeetCode 题目 215. Kth Largest Element in an Array,时间复杂度O(nlogn):
//215. Kth Largest Element in an Arrayint findKthLargest(vector<int>& nums, int k) { //默认为大顶堆,等同于 priority_queue<int,vector<int>,less<int>> q;priority_queue<int> q(nums.begin(),nums.end());for(int i=0;i<k-1;i++) q.pop();return q.top();}
相关LeetCode题:
703. Kth Largest Element in a Stream 题解
295. Find Median from Data Stream 题解
将顶部节点一一取出,即可实现堆排序,例如经典的题目 23. Merge k Sorted Lists,用优先级队列求解时间复杂度为O(nlogk),n为总元素数、k为list数,可视化堆排序
相关LeetCode题:
23. Merge k Sorted Lists 题解
自定义优先级
对于优先级队列,我们可以自定义优先级判断标准,比如按元素频次、距离、成本等。这时我们需要自定义优先级队列的比较方式:
struct compare{bool operator()(const pair<char,int> a,const pair<char,int> b){return b.second > a.second;} };//priority_queue<Type, Container, Functional>priority_queue<pair<char,int>,vector<pair<char,int>>,compare> pq;
相关LeetCode题:
451. Sort Characters By Frequency 题解
347. Top K Frequent Elements 题解
692. Top K Frequent Words 题解
973. K Closest Points to Origin 题解
767. Reorganize String 题解
优先级队列与贪心
由优先级队列可方便地取得极值,而极值本身体现了贪心(Greedy)的思想;在用到贪心思路解题时,可以考虑借助优先级队列获取极值。
相关LeetCode题:
1046. Last Stone Weight 题解
253. Meeting Rooms II 题解
871. Minimum Number of Refueling Stops 题解
502. IPO 题解
优先级队列与BFS
在 算法与数据结构基础 - 队列(Queue) 介绍了常用队列模拟广度优先搜索(BFS)过程,优先级队列作为特殊的队列,同样可以用于BFS、以实现对临近节点按优先级搜索。
相关LeetCode题:
778. Swim in Rising Water 题解
转载于:https://www.cnblogs.com/bangerlee/p/11205539.html
算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)相关推荐
- codeforces 贪心+优先队列_算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)...
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值:
- 【STL学习】优先级队列Priority Queue详解与C++编程实现
优先级队列Priority Queue介绍 优先级队列是一个拥有权值观念的queue.它允许在底端添加元素.在顶端去除元素.删除元素. 优先级队列内部的元素并不是按照添加的顺序排列,而是自动依照元素的 ...
- 优先级队列(Priority Queue)
优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素.但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素, ...
- 什么是java优先级队列_什么是Java优先级队列(Priority Queue)?
39 优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索.无论何时调用remove方法,总会获得当前优先级队列中的最小元素,但并不是对所有元素都排序.它是采用了堆(一个可以自我调整 ...
- 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记
一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...
- asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)
数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...
- 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- 数据结构,堆和栈和队列的概念
数据结构,堆和栈和队列的概念 1 什么是数据结构 数据结构是计算机存储,组织数据的反复改.数据结构是指相互之间存在的一种或多种特定关系的数据元素集合. 2 数据结构的逻辑结构 1 集合结构,元素都是孤 ...
- 数据结构之堆Heap
1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 2. 堆 ...
最新文章
- webwork 标签 基本用法 例子
- [js] for in 和 for of 的区别?
- PowerShell 方式部署Sharepoint Solution
- 30-40岁的程序员们,请把一些账算清楚,为过冬做准备(一)
- 1.Docket 安装简介
- vue项目下,webpack.js/package.json配置
- dlna 斐讯r1怎么用_挽救智障——斐讯R1:固件升级、安装DLNA和Soundwire
- tp1900芯片对比7621a_MT7621A和MT7620A两个芯片各有什么特点?
- FreeSWITCH折腾笔记9——使用FS做一个i-SBC
- 养生粥秘方,据说可以补气、泻火和去湿
- 使用pyinstaller打包.py文件生成.exe文件
- 如何通过三视图判断立方体个数_“三视图”“小正方体个数”一篇搞定!
- 傅里叶变换和逆变换公式的我理解意义
- java 对接中国银联 云闪付
- HTML+CSS仿写京东登陆页面附代码(web前端期末大作业)
- 在c++中关于堆和堆栈的区别
- windows使用命令执行exe文件
- 微信小程序实战十:搜索列表的实现
- php wscript.shell组件,wscript.shell × 命令行执行组件
- CD4017 十进制计数器工作原理及应用大全(不断更新中......)