首页 > 编程语言 >PriorityQueue源码解析

PriorityQueue源码解析

时间:2024-08-22 16:39:09浏览次数:11  
标签:pq nums int PriorityQueue add 源码 largest 解析

PriorityQueue

优先级队列:默认每次取出权值最小的元素,元素的大小评判可以通过元素自身的自然顺序,也可以在构造时传入比较器进行定义顺序规则。

用法

//不传比较器
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.add(3);
pq.add(4);
pq.add(1);
pq.add(2);
//输出顺序 1 2 3 4
//使用比较器
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b-a);
pq.add(3);
pq.add(4);
pq.add(1);
pq.add(2);
//输出顺序 4 3 2 1

概述

底层通过堆实现,具体是使用完全二叉树实现的小顶堆。所以可以通过数组来作为底层实现

对于任意一个下标i,在不溢出的前提下

  • lson = i * 2 + 1

  • rson = i * 2 + 2

  • parent = (i-1) / 2

时间复杂度

由于使用了堆这种数据结构,在添加元素和删除元素时需要调整堆,所以添加删除操作的时间复杂度都是O(longN),peek和element方法是常数时间。

插入的时候插入队尾,然后调整堆

删除操作的时候将堆顶和队尾元素交换,然后删除队尾,然后调整堆

堆排序源码

堆排序其实就两个操作,首先是建堆,其次是排序

    private void heapSort(int[] nums, int n) {
        //建堆
        for(int i = (n-1) / 2; i >=0; i--){
            heapify(nums, n, i);
        }
        //排序
        for(int i = n - 1; i >= 0; i--){
            swap(nums, 0, i);
            heapify(nums, i, 0);
        }

    }

    private void heapify(int[] nums, int n, int i) {
        int largest = i;
        int lson = i*2+1;
        int rson = i*2+2;
        if(lson < n && nums[lson] > nums[largest]){
            largest = lson;
        }
        if(rson < n && nums[rson] > nums[largest]){
            largest = rson;
        }
        if(largest!=i) {
            swap(nums, i, largest);
            heapify(nums, n, largest);
        }
    }

标签:pq,nums,int,PriorityQueue,add,源码,largest,解析
From: https://www.cnblogs.com/lilizzyy/p/18374206

相关文章

  • AI聊天機器人全解析:類型、應用場景與四大優勢
    在数字化浪潮的推动下,人工智能(AI)正逐渐渗透到我们生活的方方面面。其中,AI聊天機器人作为一种新兴的交互方式,正在重塑我们与机器沟通的模式。本文将深入解析AI聊天機器人的基础概念、主要类型、应用场景以及它们所带来的四大优势。聊天機器人:虚拟世界中的智能助手AI聊天機器人......
  • CANoe_UDS-boorloader 自动化测试系列(六)基本功能:CAPL实现bin文件数据解析
    CANoe_UDS-booroader自动化测试系列(一)创建一个CANoe测试工程(测试节点的选选择)CANoe_UDS-booroader自动化测试系列(二)基本刷写流程CANoe_UDS-booroader自动化测试系列(三)基本功能:CAPL实现UDS协议下的CAN报文接收#解析#发送CANoe_UDS-booroader自动化测试系列(四)基本功能:CAPL实......
  • ArrayDeque源码解读
    ArrayDequeArrayDeque和LinkedList是Deque的两个通用实现,在使用Queue时,由于Queue只是一个接口,因此创建Queue时也会使用ArrayDeque为了实现在数组两端进行操作元素的需求,因此ArrayDeque使用循环数组作为底层数据结构,同时,ArrayDeque中定义了head和tail两个指针指向头和尾因为是循......
  • java+vue计算机毕设旅游景点预约系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,人们对旅游体验的需求日益个性化与高效化。传统的旅游预订方式往往存在信息不对称、购票流程繁琐、景点拥堵等问题,影响了游客的......
  • java+vue计算机毕设开放实验室网上预约系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育体系的不断发展和教育资源的日益丰富,实验室作为培养学生实践能力和创新精神的重要场所,其使用效率与管理水平成为衡量高校教学质量的重要......
  • java+vue计算机毕设农资电子监管系统的设计与实现【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着农业现代化的不断推进,农资产品的流通与管理成为保障农业生产高效、安全的重要环节。传统农资管理模式存在信息不对称、监管难度大、效率低下等问......
  • 【C语言进阶】数据如何安家?C语言内存中的存储艺术深度解析
    ......
  • Spring Cloud LoadBalancer 源码解析
    前言LoadBalancer(负载均衡器):一种网络设备或软件机制,用于分发传入的网络流量负载到多个后端目标服务器上,依次来提高系统的可用性和性能,SpringCloud2020版本以后,移除了对Netflix的依赖,也就移除了负载均衡器Ribbon,SpringCloud官方推荐使用Loadbalancer替换Ribbon,并......
  • 基于spring boot的幼儿园管理系统的设计与实现:幼儿园管理系统(源码+文档)
    目录一.研究内容和目的二.开发工具三.开发框架介绍四.系统需求分析五.幼儿园管理系统结构设计六.数据库设计七,系统页面展示八.源码获取一.研究内容和目的研究内容:本文基于SpringBoot框架设计和实现幼儿园管理系统,主要包括以下内容:幼儿园管理系统需求分析对幼儿园......
  • JSP基于JSP的二手车交易管理系统40fjs--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:用户,卖家,车辆类型,车辆信息,预定信息,取消信息,反馈信息技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主......