IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 优先级队列 -> 正文阅读

[数据结构与算法]优先级队列

优先级队列

队列是一种先进先出的数据结构,这一点刚好和相反。

但是队列的先进先出是根据顺序来决定出队列的元素,而优先级队列可以做到根据优先级出队列

基本介绍

优先级队列有两种:

  • PriorityQueue :线程不安全
  • PriorityBlockingQueue:线程安全

这里主要介绍PriorityQueue,其中PriorityQueue的底层是(以后遇到了再总结),堆的底层是数组。

PriorityQueue的构造器:

构造器解释说明
public PriorityQueue()无参构造器
public PriorityQueue(int initialCapacity)指定容量为initialCapacity的构造器
public PriorityQueue(Comparator<? super E> comparator)指定集合元素的构造器
public PriorityQueue(int initialCapacity,Comparator<? super E> comparator)指定初始容量和集合的构造器

使用细节:

  • PriorityQueue中放置的元素必须要能够比较大小 (只有实现了 Comparable 和 Comparator 接口的类才能比较大小),不能插入无法比较大小的对象,否则会抛出 ClassCastException 异常
  • 不能插入 null 对象,否则会抛出 NullPointerException 异常
  • 没有容量限制,可以插入任意多个元素,其内部可以自动扩容
  • 插入和删除元素的时间复杂度均为 O(log2N)
  • PriorityQueue底层使用了堆数据结构

PriorityQueue中,最小的元素为优先级最高的元素

常用方法

api介绍
boolean offer(E e)插入元素e,如果e为空抛出NullPointerException异常,否则返回true
E peek()获取优先级最高的元素,如果优先级队列为空,返回 null
E poll()移除优先级最高的元素并返回,如果优先级队列为空,返回 null
int size()获取有效元素的个数
void clean()清空
boolean isEmpty()检测优先级队列是否为空,空返回 true

特别的入队列和出队列

操作抛异常返回特殊值
入队列add(e)offer(e)
出队列remove()poll()
获取队首元素element()peek()

其中有自动扩容的方法,即grow()

应用实例

合并k个升序链表

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length == 0) return null;
        //匿名内部类,用lombota表达式简述了
        PriorityQueue<ListNode> queue = new PriorityQueue<>(
            lists.length,(a,b)->(a.val-b.val)
        );
        ListNode res = new ListNode(-1);
        ListNode p = res;
        for(ListNode node : lists){
            if(node != null) queue.add(node);
        }
        while(!queue.isEmpty()){
            //每次找的都是所有链表内的最小值
            ListNode node = queue.poll();
            p.next = node;
            if(node.next!=null) queue.add(node.next);  //把剩下的节点继续加入优先级队列内,继续往下寻找
            p = p.next;
        }
        return res.next;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:57:52  更:2022-05-01 16:01:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:45:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码