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

【数据结构】堆的初始化——如何初始化一个大根堆?

文章目录

  • 源码是如何插入的?
  • 扩容
  • 向上调整
  • 实现大根堆
    • 代码:

源码是如何插入的?

在这里插入图片描述

扩容

在这里插入图片描述

在扩容的时候,如果容量小于64,那就2倍多2的扩容;如果大于64,那就1.5倍扩容。

还会进行溢出的判断,如果决定的新容量大于给的数组最大容量,那就将其限制在数组最大容量:
在这里插入图片描述

向上调整

在这里插入图片描述

在进行向上调整的时候,会对传进来的comparator进行判断,如果不为空,那就使用程序员传进来的比较器接口,如果为空,那就说明调用者并未实现比较器,那么就使用java自己提供的函数siftUpComparable(k, x);

传进来的x就是要插入的值e。

在这里插入图片描述

这是使用程序员自己传进来的比较器进行比较,调用了compare接口进行比较,所以要想初始化一个大根堆,那就得自己写出一个compare函数然后传进去。

在使用自己写的compare函数时,会让x强转为Comparable类型,如果这个x不是可以比较的(未实现Comparable接口,那就会抛出类型转换异常)

实现大根堆

值得说明的是:
比较器函数是Comparator而不是Comparable。

代码:

import java.util.Comparator;
import java.util.PriorityQueue;class IntCmp implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {// 当然,写o1.compareTo(o2)仍然是小根堆return o2.compareTo(o1);}
}public class Test {public static void main(String[] args) {PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.offer(1);priorityQueue.offer(2);priorityQueue.offer(3);priorityQueue.offer(4);System.out.print(priorityQueue.poll());System.out.print(priorityQueue.poll());System.out.print(priorityQueue.poll());System.out.println(priorityQueue.poll());// 1 2 3 4,可以发现java中提供的默认堆是小根堆System.out.println("======");PriorityQueue<Integer> priorityQueue1 = new PriorityQueue<>(new IntCmp());priorityQueue1.offer(1);priorityQueue1.offer(2);priorityQueue1.offer(3);priorityQueue1.offer(4);System.out.print(priorityQueue1.poll());System.out.print(priorityQueue1.poll());System.out.print(priorityQueue1.poll());System.out.print(priorityQueue1.poll());// 4 3 2 1,变为大根堆}
}
http://www.lryc.cn/news/133579.html

相关文章:

  • 【韩顺平 零基础30天学会Java】程序流程控制(2days)
  • 从入门到精通Python隧道代理的使用与优化
  • 19万字智慧城市总体规划与设计方案WORD
  • [赛博昆仑] 腾讯QQ_PC端,逻辑漏洞导致RCE漏洞
  • python Requests
  • 【深入解析:数据结构栈的魅力与应用】
  • 安卓机显示屏的硬件结构
  • 基于swing的超市管理系统java仓库库存进销存jsp源代码mysql
  • 常用系统命令
  • 【Spring专题】Spring之Bean生命周期源码解析——阶段四(Bean销毁)(拓展,了解就好)
  • 配置Docker,漏洞复现
  • 微信小程序 游戏水平评估系统的设计与实现_pzbe0
  • moba登录不进去提示修改问题问题解决方式
  • Unsafe upfileupload
  • 机器人制作开源方案 | 滑板助力器
  • 飞机打方块(二)游戏界面制作
  • 自我理解:精度(precision)和召回(recall)
  • Nginx 使用 HTTPS(准备证书和私钥)
  • Java:集合框架:Set集合、LinkedSet集合、TreeSet集合、哈希值、HashSet的底层原理
  • 自定义Taro的navBar的宽度和高度
  • 用Python编程实现百度自然语言处理接口的对接,助力你开发智能化处理程序
  • 系统架构设计专业技能 · 系统工程与系统性能
  • 初识网络原理(笔记)
  • 嵌入式C语言基本操作方法之经典
  • postgresql \watch实用的使用方法
  • Cocos2d 项目问题记录
  • 系统架构合理性的思考 | 京东云技术团队
  • Amelia预订插件:WordPress企业级预约系统
  • 共享门店模式:线下门店的商家如何利用它增加客户
  • 实现矩阵地图与rviz地图重合