Java 数据结构与算法系列精讲之二叉堆
作者:我是小白呀 发布时间:2022-05-14 06:31:15
标签:Java,二叉堆,数据结构
概述
从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.
优先队列
优先队列 (Priority Queue) 和队列一样, 是一种先进先出的数据结构. 优先队列中的每个元素有各自的优先级, 优先级最高的元素最先得到服务. 如图:
二叉堆
二叉堆 (Binary Heap) 是一种特殊的堆, 二叉堆具有堆的性质和二叉树的性质. 二叉堆中的任意一节点的值总是大于等于其孩子节点值. 如图:
二叉堆实现
获取索引
// 获取父节点的索引值
public int parent(int index) {
if (index <= 0) {
throw new RuntimeException("Invalid Index");
}
return (index - 1) / 2;
}
// 获取左孩子节点索引
public int leftChild(int index) {
return index * 2 + 1;
}
// 获取右孩子节点索引
public int rightChild(int index) {
return index * 2 + 2;
}
添加元素
// 添加元素
public void add(E e) {
data.add(e);
siftUp(data.size() - 1);
}
siftUp
// siftDown
private void siftDown(int k) {
while (leftChild(k) < data.size()) {
int j = leftChild(k);
if (j + 1 < data.size() && data.get(j + 1).compareTo(data.get(j)) > 0) {
j++;
}
if (data.get(k).compareTo(data.get(j)) >= 0) {
break;
}
Collections.swap(data, k, j);
k = j;
}
}
完整代码
import java.util.ArrayList;
import java.util.Collections;
public class BinaryHeap<E extends Comparable<E>> {
private ArrayList<E> data;
// 无参构造
public BinaryHeap() {
data = new ArrayList<>();
}
// 有参构造
public BinaryHeap(int capacity) {
data = new ArrayList<>(capacity);
}
// 或者元素个数
public int size() {
return data.size();
}
// 判断堆是否为空
public boolean isEmpty() {
return data.isEmpty();
}
// 获取父节点的索引值
public int parent(int index) {
if (index <= 0) {
throw new RuntimeException("Invalid Index");
}
return (index - 1) / 2;
}
// 获取左孩子节点索引
public int leftChild(int index) {
return index * 2 + 1;
}
// 获取右孩子节点索引
public int rightChild(int index) {
return index * 2 + 2;
}
// 添加元素
public void add(E e) {
data.add(e);
siftUp(data.size() - 1);
}
// siftUp
private void siftUp(int k) {
while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0) {
Collections.swap(data, k, parent(k));
k = parent(k);
}
}
// siftDown
private void siftDown(int k) {
while (leftChild(k) < data.size()) {
int j = leftChild(k);
if (j + 1 < data.size() && data.get(j + 1).compareTo(data.get(j)) > 0) {
j++;
}
if (data.get(k).compareTo(data.get(j)) >= 0) {
break;
}
Collections.swap(data, k, j);
k = j;
}
}
}
来源:https://iamarookie.blog.csdn.net/article/details/122020449


猜你喜欢
- 使用注解的形式,装配在id字段,自动调用fegin赋值给目标字段。使用效果1.先给vo类中字段添加注解 2.调用feignData
- 手机或照机拍摄的照片名称通常是”IMG_001.JPG”这种格式,这种文件名称是无意义的。使用照片拍摄时间命名可以让我们在多年以后查找照片时
- 前言昨晚想在Android应用中增加一个int映射到String的字典表,使用HashMap实现的时候,Eclipse给出了一个警告,昨晚项
- 前言:Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务。设想一种场景,服务器可能会在很短时间内
- 首先添加一个timer,50susing System;using System.Collections.Generic;using Sys
- 我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去
- EasyCode 插件EasyCode 插件 是一款根据表结构生成代码的很方便的Idea插件, 强烈推荐. 并且可以自定义模板来控制生成的类
- 知乎是一个真实的网络问答社区,社区氛围友好、理性、认真,连接各行各业的精英。他们分享着彼此的专业知识、经验和见解,为中文互联网源源不断地提供
- 发送虚拟请求访问controller我们在test类中虚拟访问controller,就得发送虚拟请求。先创建一个controllerpack
- 设计模式要进行共性与可变性的分析,对共性进行抽象,同时对可变性进行封装,没有完美的设计模式,作为一名开发者要懂得取舍,触类旁通,开发出高内聚
- 序言:事件:此web项目的功能及其简单,就是有客户端来访问redis序列号服务时发送jison报文,项目已经在测试环境成功运行2周了,具体的
- 有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有
- 60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计
- Java数字格式类以下两个类可用于格式化和解析数字:java.text.NumberFormatjava.text.DecimalForma
- 将Fragment与Layout结合使用,一般都是主Activity以frame填充Activity的方式交互管理Fragment :1.由
- 模板方法模式模板方法模式法(Template Method)定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算
- 首先,这两者是完全不同的概念,绝对不能混为一谈。1.什么是Java内存模型?Java内存模型是Java语言在多线程并 * 况下对于共享变量读写
- 如何获取yml、properties参数1、使用@Value()注解1.1 配置数据如:在properties.yml文件配置如下数据mes
- 前言:经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环。本以为单纯的ViewPager就可以实
- 一、项目简述( +IW文档)功能:本系统分用户前台和管理员后台。 本系统用例模型有三种,分别是游客、注册用户和系统管 理员。下面分别对这三个