首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java集合与数据结构——优先级队列使用及练习

接上篇 Java集合与数据结构——优先级队列(堆) 一、对象比较方法   上节课我们讲了优先级队列优先级队列在插入元素时有个要求:  插入元素不能是null或者元素之间必须要能够进行比较,...为了简单起见,我们只是插入了Integer类型,那优先级队列中能否插入自定义类型对象呢?   ...我们先不用优先级队列比较,先来看自定义类型如何进行比较… ?   我们写了一个 Student 一个类,类内部有姓名和年龄两个属性,我们直接通过数组类进行比较… 我们来看结果 ?   ...那么我们一个自定义类型中有两个属性甚至多个属性情况下,如何进行比较呢?...用户也可以选择使用比较对象,如果用户插入自定义类型对象时,必须要提供一个比较类,让该类实现Comparator接口并覆写compare方法。 ?

60230

C++ STL学习之【优先级队列

,不过优先级队列 priority_queue 中加入了 泛型编程 思想,并且属于 STL 中一部分 这就是一个堆,顶上石头 优先级最高 或 优先级最低 ---- ️正文 1、优先级队列使用...首先需要认识一下优先级队列 priority_queue 1.1、基本功能 优先级队列构造方式有两种:直接构造一个空对象 和 通过迭代区间进行构造 直接构造一个空对象 #include <...} 注意: 默认比较方式为 less,最终为 优先级值排在上面(大堆) 通过迭代区间构造对象 #include #include #include...= last) { push(*first); first++; } } 测试: 2.2、基本功能 因为是容器适配器,所以优先级队列也没有迭代 同时基本功能也比较少,首先来看看比较简单容量相关函数...//优先级队列大小(有效元素数) size_t size() const { return _con.size(); } 获取堆顶元素:堆顶元素即第一个元素(完全二叉树根) //堆顶元素(优先级

18720
您找到你想要的搜索结果了吗?
是的
没有找到

C++初阶:容器适配器priority_queue常用接口详解及模拟实现、仿函数介绍

[first, last)元素 empty() 检测优先级队列是否为空,是返回true,否则返回false top() 返回优先级队列中最大(最小)元素,即堆顶元素 push(x) 在优先级队列中插入元素...是元素类型,Container是底层容器类型(默认为vector),Compare是元素比较函数对象类型(默认为std::less,用于最大堆)。...priority_queue(first, last):使用范围为[first, last)迭代构造一个优先队列。 默认行为: 默认情况下,优先队列是最大堆,即最大元素位于堆顶。...可以通过自定义比较函数对象来改变这一行为,从而创建最小堆或者基于自定义优先级规则进行排序。...函数对象通常用于STL中算法、容器和适配器中,它们可以作为参数传递给算法,用于自定义排序、查找、比较等操作。

14310

c++ stl 优先队列_低优先级队列要等几局

,接下来就说一说什么是仿函数: 前面我们知道加入了仿函数参数将默认建大堆改为了建小堆,而建大堆和建小堆代码唯一区别就在于向上调整算法和向下调整算法当中比较符号改变,那么我们怎么可以让它可以灵活改变呢...中放自定义类型数据,用户需要在自定义类型中提供> 或者< 重载。...Date(2021,12,24)); pq.push(Date(2022,11,24)); cout<<pq.top()<<endl; pq.pop(); //选出最大 return 0; } 当我们优先级队列使用自定义类型时...因为push和pop操作会调用仿函数类重载函数,该重载函数进行比较时,默认是不支持自定义类型比较,所以需要重载 我们还可以这样玩:当传时Date*时,用less仿函数会有问题: int main...因为我们数据类型为指针,仿函数类型重载函数比较是地址大小,所以会出问题 这是一种仿函数变异玩法,我们可以控制仿函数比较方式我们需要另外写个仿函数: class PDateLess { public

57520

【C++】优先级队列介绍与模拟实现

,对应得代码也有些许差异,但为了减少代码量,提高程序员编程效率,我们就可以在上述优先级队列类模板中再传入一个仿函数,对于不同堆传不同仿函数类以实现不同需求; 模板不能直接传入函数,但是可以传类型...,可以是自定义类型也可以是内置类型,所以可以传入一个仿函数(它本质是一个类) 4.优先级队列模拟实现 优先级队列模拟实现和队列类似,所不同是每次插入数据后都会使用算法将队列数据调整为一个堆,每次删除也是删除堆顶元素...,大家可以依照堆向下调整自己试试看写一下大堆向上调整 ✨仿函数 有了堆向下调整算法来删除堆顶元素和建堆,以及堆向上调整算法尾插元素,我们就可以实现优先级队列了 但是优先级队列能否按照我们需要选择大堆还是小堆呢...,为了和STL库里面的命名保持一致,我们使用Less建立大堆,Greater建立小堆,因为建大堆还是小堆关键就在于父节点与孩子节点比较是大于还是小于,所以我们将所有比较地方都使用仿函数,这样就可以按照我们希望方式来比较...,如果希望是大堆,就按Less中比较 这样就可以将上述仿函数传给优先级队列了: //优先级队列模拟实现 template<class T,

9310

【C++】通过priority_queue、reverse_iterator加深对于适配器和仿函数理解

优先级队列实际就是数据结构初阶所学堆,堆本质就是优先级,父节点比子节点大就是大堆,父节点比子节点小就是小堆,这其实就是优先级队列。...我们可以直接利用优先级队列结构特点,先利用vector迭代区间构造一个默认是大堆优先级队列,然后依次pop k-1次堆顶数据,最后堆顶数据就是第K个最大元素,直接返回即可。...在优先级队列中增加仿函数也是比较简单,具体逻辑和前面所说冒泡排序实际是差不多,唯一不同是,冒泡排序那里是函数模板,对于函数模板所传参数是仿函数实例化出来对象,或者是函数指针类型定义出来指针变量...但是当优先级队列存储数据不再是日期类对象,而是日期类对象地址时,那在优先级队列内部比较时候,就不再是比较日期了,而变成比较地址大小了,但是各个对象之间地址又没有关系,这个时候原有的仿函数无法满足我们要求了...,需要用户在自定义类型中提供<重载 priority_queue q1; q1.push(Date(2018, 10, 29));//让优先级队列存储日期类匿名构造 q1.push

61930

【C++】STL——容器适配器priority_queue(优先级队列)详解 及 仿函数介绍和使用

就比如我们这里优先级队列控制这个大堆小堆,我们之前实现过堆,我们知道控制大堆小堆其实就是就是控制里面元素比较方式不同。...而我们刚才这样写是只针对整型,如果像比较任意类型我们就可以将他实现成模板: 1.2.2 在OJ中使用:数组中第K个最大元素 下面我们来看一个题:数组中第K个最大元素 思路1:排序 那这道题我们容易想到方法应该就是堆数组排个序...那现在呢,我想用我们priority_queue(优先级队列)去存我们自定义类型数据——日期类变量,可以吗?...所以: 如果在priority_queue中放自定义类型数据,用户需要在自定义类型中提供> 或者< 重载 4...._day; return _cout; } //int main() //{ // 大堆,需要用户在自定义类型中提供<重载 // //yin::priority_queue q1;

1.1K21

理解堆和优先队列

Williams在1964年发表堆排序,当时他提出了二叉堆树作为此算法数据结构,堆在戴克斯特拉算法和优先级队列中亦为重要关键。...优先队列至少需要支持下述操作: a.插入优先级元素 b.取出具有最高优先级元素 c.查看最高优先级元素。 综合考虑插入和删除性能 优先队列一般采用堆来实现。...3.3 优先队列自定义优先级 模板化优先队列扩展了使用场景,但是也产生了新问题,就是默认优先级比较函数不一定满足所有要求,因此很多时候都需要自己来定义优先级判定函数。...实现了一个模板优先队列需要三个参数: 容器元素类型 存储数据所用容器 比较函数 缺省情况是less #include // 队列和优先队列声明 std::queue pq;...可以认为优先队列是对堆工具化封装,加上模板和自定义比较函数两个利器加持,优先队列让使用者不再苦于堆排序原始造轮子。

82120

堆和优先队列

,因为我们每次在向优先队列中添加新元素时,都需要对优先队列中所有元素优先级进行对比,然后添加到按优先级排序中位置。...当我们使用数组表示最大堆时,我们可以使用在常见线性结构中自定义动态数组,这样我们在向堆中添加和删除元素时,我们就可以动态地改变数组容量,不需要考虑数组容量问题了。.../** * 基于二叉最大堆性质:堆中某个节点值总是不大于其父节点值 * @param 二叉最大堆元素必须要具有可比较性 */ public class MaxHeap<E extends...在heapify代码实现之前,我们需要在实现动态数组中添加一个构造,该构造可以将传入数组转为动态数组。...,对与100万个整数这种数据量来说,O(nlogn)和O(n)这两种时间复杂度所花费时间差不多: 基于堆实现优先队列 这里是基于自定义大堆进行实现优先队列,元素值越大,优先级越高,具体代码实现如下

11610

【C++初阶】仿函数和priority_queue模拟实现(附源码)

仿函数特点 1.仿函数即使定义相同,也可能有不同类型; 2.仿函数通常比一般函数速度快; 3.仿函数使程序代码变简单。... Le; cout << Le(a, b) << endl; //像函数一样调用 return 0; } 二.模拟实现priority_queue priority_queue即优先级队列...,它底层是一个堆,且默认是大堆,所以在模拟实现优先级队列时要先建堆,不了解的话可以参考文章:堆实现 相关接口: 源码 //less是库里仿函数, 用来判断左操作数是否小于右操作数,可以用来建大堆...//greater也是库里仿函数,比较左操作数是否大于右操作数,可以用来建小堆 //库里比较是内置类型大小,如果是自定义类型,那么自定义类型里就必须要重载 > 或 < 运算符 template<...之前在C语言那里时候,还得自己造轮子,手搓一个堆出来,但是C++不用了,直接使用优先级队列priority_queue class Solution { public: int findKthLargest

9510

【C++】优先级队列priority_queue&&仿函数

),需要支持随机访问迭代,以便始终在内部保持堆结构 一、使用 在有了前面容器使用基础之下,我们对于优先级队列priority_queue使用成本不是很大,值得注意是头文件为 普通队列是先进先出...,优先级队列默认是优先级先出 Container:优先级队列默认使用vector作为其底层存储数据容器,支持[]使用,支持随机访问,在vector上又使用了堆算法将vector中元素构造成堆结构...构造函数 接口 查看文档接口 常用接口 函数声明 接口说明 priority_queue()/priority_queue(first, last) 构造一个空优先级队列 empty( ) 检测优先级队列是否为空...自定义类型 这里比较大小是比较常见,如果是自定义类型: 比如日期类,那该如何去进行大小比较?一种是重载大小比较运算符,使之支持日期类大小比较。...:自定义类型会调用自己迭代区间构造,所以我们并不需要一个一个push,走个初始化列表即可,同时,数据进去之后我们还要建堆,利用向下调整算法:从倒数第一个非叶子节点,既最后一个节点父节点开始进行向下调整

19530

一文带你掌握 优先级队列

empty(): 检查队列是否为空 priority_queue特点: 它是一个容器类模板,可以存储任何可比较类型。 该容器中元素按照一定比较规则(默认为大根堆)排列,允许用户自定义规则。...这里优先级队列就是一个堆结构. void test1() { //构造1: priority_queue pq1;//创建一个空优先级队列 默认是大堆 //向优先级队列中插入一些数据...所以不难得出,大堆是排序是降序. 2.2 利用优先级队列排序(升序) 通过观察源码,我们不难发现,优先级队列有三个模板参数,其中后两个是某仍给出....: 前面说了,优先级队列就是堆,那么堆算法中,元素比较方法会决定是大堆还是小堆....(当然,也可以不写,因为会默认调用) (2)迭代区间构造 将迭代区间值依次插入(push())进优先级队列. (2) push() 将数据先尾插进容器.

21211

【C++修炼之路】13. priority_queue及仿函数

此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部元素) 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定成员函数来访问其元素...二. priority_queue使用 优先级队列默认使用vector作为其底层存储数据容器,在vector上又使用了堆算法将vector中元素构造成堆结构,因此priority_queue就是堆...,用户需要在自定义类型中提供> 或者< 重载。...sizeof(a) / sizeof(int); i++) { cout << a[i] << " "; } return 0; } 四.priority_queue模拟实现 既然已经知道优先级队列仿函数相关知识...,需要用户在自定义类型中提供<重载 priority_queue q1; q1.push(Date(2018, 10, 29)); q1.push(Date(2018, 10, 28

44600

数据结构——优先队列(C++和Java实现)

十几天没有更新自己博客了,因为目前在算法和数据结构学习中,碰到了一些问题,例如之前就在优先队列,堆这个数据结构面前,感觉到有点吃不透概念,而使用那本书上写实在太抽象了,所以又查找了很多资料,最终对优先队列这个数据结构有了一定了解...花了点时间才啃下来知识,当然要把它记录下来了,所以今天就来回顾一下优先队列。 优先队列也是一种抽象数据类型。优先队列每个元素都有各自优先级。这个概念其实打几个比方会理解比较快一点。...比如我们人人都用过windows系统,当我们打开任务管理时候,每个任务优先级别是不同,而操作系统会选择优先级别最高任务先执行,同时我们也能在选项里标记任务优先级。...优先队列也是一个道理,优先处理优先级别高数据或者任务。 优先级最高元素最先得到服务,优先级别相同元素按照其在优先队列顺序得到服务。优先队列往往用堆来实现。...优先队列至少要支持这些操作: 插入优先级元素。 取出具有最高优先级元素。 查看最高优先级元素。

54830

【c++】优先级队列与仿函数:C++编程强大组合

此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部元素)。...注意:默认情况下priority_queue是大堆 构造函数 有关这些参数使用我们后文进行详细讲解,创建一个优先级队列: priority_queue pq; empty(...) 检测优先级队列是否为空,是返回true,否则返回false top( ) 返回优先级队列中最大(最小元素),即堆顶元素 push( ) 在优先级队列中插入元素x pop( ) 删除优先级队列中最大...默认是 std::less,该函数使得最大元素被认为是最高优先级(形成最大堆)。...如果在priority_queue中放自定义类型数据,用户需要在自定义类型中提供> 或者< 重载 class Date { public: Date(int year = 1900, int month

10410

C++初阶-stackqueuepriority_queue使用和模拟

last) 构造一个空优先级队列 empty( ) 检测优先级队列是否为空,是返回true,否则返回 false top( ) 返回优先级队列中最大(最小元素),即堆顶元素 push(x) 在优先级队列中插入元素...q2.empty()) { cout << q2.top() << " "; q2.pop(); }cout << endl; } 结果: 注意:如果在priority_queue中放自定义类型数据...,用户需要在自定义类型中提供> 或者< 重载 示例: class Date { public: Date(int year = 1900, int month = 1, int day = 1)...,需要用户在自定义类型中提供<重载 priority_queue q1; q1.push(Date(2021, 10, 19)); q1.push(Date(2021, 10, 29...,为了维护其“整体连续”以及随机访问假象,落在了deque迭代身上,因此deque迭代设计就比较复杂 示图: 迭代如何维护空间: 总结 优势: 与vector比较,deque头部插入和删除时

28920

力扣LeetCode,前 K 个高频元素

// 这里定义优先级意思,是频次低优先级高, 52 // 对于优先队列,底层虽然是最大堆,取出优先级那个元素,但是这个优先级最高这个元素是频次最低那个元素...86 // 此时,求出,前k个频数最高元素 87 // 由于此时,优先队列承载元素类型是什么类型呢,此时map是键值对形式 88 // 要依据元素所对应频类来决定优先级...,可以自定义比较方式进行实现。...,比较 35 // 如果优先队列里面存储就是字符串,java默认字符串大小比较是按照字典序进行比较, 36 // 如果有一个自定义字符串比较方案,由于不能修改Java中字符串比较方法...,比较 35 // 如果优先队列里面存储就是字符串,java默认字符串大小比较是按照字典序进行比较, 36 // 如果有一个自定义字符串比较方案,由于不能修改Java中字符串比较方法

62610

Java基础(八) 堆

优先队列 优先队列是计算机科学中一类抽象数据类型。优先队列每个元素都有各自优先级优先级最高元素最先得到服务;优先级相同元素按照其在优先队列顺序得到服务。...和堆区别 优先队列是一种抽象数据类型,而堆就是具体数据结构。也就是说,堆是优先队列实现之一。 堆 堆是一种特别的二叉树,需要满足以下两个性质才能称为堆。...完全二叉树 父节点值始终大于等于或小于等于子节点值 堆分类 最大堆/大根堆 最大值是根节点 最小堆/小根堆 最小值是根节点 堆操作复杂度 堆常用方法 小根堆创建...PriorityQueue(); 大根堆创建 PriorityQueue maxHeap = new PriorityQueue(Collections.reverseOrder()); 创建初始值...最大堆排序算法步骤如下: 将所有元素堆化成一个最大堆; 取出并删除堆顶元素,并将该堆顶元素放置在存储有序元素数据集T中; 此时,堆 会调整成新大堆; 重复 3 和 4 步骤,直到堆中没有元素;

42370
领券