【JAVA】堆实现

堆之最小堆、最大堆(java实现) 文章目录堆图解最大堆的api设计最大堆代码实现最小代码实现 堆 定义:堆是树型的一对多的数据结构,使用数组实现 对应完全二叉树 每个节点大于等于或者小于等于它的子节点 二叉树: 每个非叶子节点最多有两个分支节点 满二叉树: 每个非叶子节点都有两个子节点 完全二叉树: 最后一层的最后一个节点的父节点不满足满二叉树之外,其它非叶子节点都满足满二叉树 堆分为最小堆和最大堆 最大堆:是一个完全二叉树,父节点不小于子节点 最小堆:是一个完全二叉树,父节点不大于子节点 堆的特性: 堆的前一半是非叶子节点,后 阅读详情

二叉堆的实现


特性

  • 结构性:
    堆是一颗完全二叉树( complete binary tree ):一棵完全被填满的树,低层上的元素从左到右填入
  • 堆序性
    (以最小堆为例)最小堆的最小元在根上,并且每个子堆也都满足父节点不大于子节点

基本的堆操作

  • insert(插入)

    1. 在下一个可用位置添加一个空穴
    2. 将该空穴与其父元素比较,若
      a. 空穴<父元素,交换两者位置,继续 2 操作
      b. 空穴>=父元素,停止,将空穴赋值为带插入元素

上述操作称作上滤 ( percolate up )

  • deleteMin(删除最小元)
    1. 在根节点建立空穴
    2. 将改空穴与其子元素比较,若
      a. 空穴<=子元素,停止,将空穴赋值为结尾元素
      b. 空穴>子元素,交换两者位置,继续2操作

需要注意的是,在选取子元素的时候,需要判断是否有左右节点,并选取两个子节点中较小的那个。上述操作称作下滤(percolate down)

  • buildHeap(构建堆)
    1. 新建一个array
    2. copy元素
    3. 对于currentSize / 2 ~ 1 的每个元素进行下滤
    4. 完成堆构建

代码实现:

package dataStructures;

import java.util.ArrayList;

/*
 *  The Min Heap is built on an array. 
 *  Elements are stored from 1 to currentsize.
 */

public class BinaryHeap<E extends Comparable<? super E>> {
    public BinaryHeap() {
        this(DEFAULT_CAPACITY);
    }
    public BinaryHeap(int capacity) {
        currentSize = 0;
        array = (E[])new Comparable[capacity];
    }
    public BinaryHeap(E[] items) {
        currentSize = items.length;
        array = (E[])new Comparable[(currentSize + 2) * 11 / 10];

        int i = 1;
        for(E item: items)
            array[i++] = item;
        buildHeap();
    }

    public void insert(E x) {
        if(currentSize == array.length - 1)
            enLargeArray(array.length * 2 + 1);

        int hole = ++currentSize;
        for(; hole > 0 && array[hole].compareTo(array[hole / 2]) < 0; hole /= 2)
            array[hole] = array[hole / 2];
        array[hole] = x;
    }
    public E findMin() {
        return array[1];
    }
    public E deleteMin() {
        if (isEmpty()) {

        }

        E minItem = findMin();
        array[1] = array[currentSize--];
        percolateDown(1);

        return minItem;
    }
    public boolean isEmpty() {
        return currentSize==0 ? true : false;
    }
    public void makeEmpty() {

    }

    private static final int DEFAULT_CAPACITY = 10;

    private int currentSize;
    private E[] array;

    private void percolateDown(int hole) {
        int child;
        E tmp = array[hole];

        for(; hole * 2 <= currentSize; hole = child) {
            child = hole * 2;
            if (child != currentSize && array[child].compareTo(array[child + 1]) > 0) {
                child++;
            }
            if (array[hole].compareTo(array[child]) > 0) {
                array[hole] = array[child];
            } else {
                break;
            }
        }
    }
    private void buildHeap() {
        for(int i = currentSize / 2; i > 0; i--) {
            percolateDown(i);
        }
    }
    private void enLargeArray(int newSize) {
        ArrayList<E> newArray = new ArrayList<E>(newSize);
        for(int i = 0; i < currentSize; i++)
            newArray.add(array[i]);
        array = (E[]) newArray.toArray();
    }
}

LMS Virtual.Lab二次开发:声学仿真结果导出方法(VBScript、Python) Siemens LMS Virtual.Lab 提供一套集成软件平台用以模拟机械系统的品质属性,如结构完整性、振动噪声、耐久性、系统动力学特性、驾驶的平顺性及操纵的稳定性等。 阅读详情

相关推荐

用scons编译STM32F103工程

想用vscode来实现代码的编辑与调试代码,原先这个工程是用STM32CUBEIDE建立的,参照STM32CUBEIDE的编译过程,编写了下面的scons脚本,scons是初次了解,既然是python脚本,那么会什么就怎么写吧。 import os import sys import glob cross_compiler_prefix = 'arm-none-eabi-' CC = cross_compiler_prefix+'gcc' CXX = cross_compiler_prefix+'g+

cylinc的专栏 1623

【堆】堆的实现(Java)

  今天学习堆这种数据结构。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个结点的值总是不大于或不小于其父结点的值; 堆总是一棵完全二叉树。 将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。 1.用优先队列实现 一般我们直接用优先队列实现堆: // 小顶堆,以 Integer 为例 PriorityQueue<Integer> pq = new PriorityQueue<>(); // 大顶堆 PriorityQueue<Int

每天更新大数据面经和技术 2522

STC8H开发(十六): GPIO模拟SPI驱动Ci24R1实现低成本无线遥控

本文详细介绍了如何使用STC8H单片机通过GPIO模拟SPI驱动Ci24R1无线模块,实现低成本无线遥控方案。内容涵盖硬件设计要点、软件驱动开发技巧及实战优化经验,特别适合消费电子产品开发者参考。Ci24R1凭借其高性价比和双模协议支持,成为替代传统nRF24L01+的理想选择。

weixin_30378623的博客 351

Java数据结构--堆

当一颗二叉树的每个节点都大于等于它的两个子字节时,它被称为堆有序。而堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级储存总而言之堆具有一下性质:①堆逻辑上是一颗完全二叉树,但本质上确是数组②堆中的某个节点总是不大于或不小于其父节点的值其中最主要且需要我们掌握的就是增( offer ) 删( poll )查( peek )等方法。

m0_74808313的博客 3027

ESP32-C3模组上实现蓝牙BLE配网功能(1)

ESP32-C3模组上实现蓝牙BLE配网功能(1)

phmatthaus的专栏 2279

R语言单因素被试内ANOVA检验

在R语言中,我们可以使用多种方法进行被试内ANOVA检验,其中包括使用内建函数或使用外部包。我们随机选择了10个被试,并对每个被试使用了三种不同的药物处理。通过上述代码示例,我们可以使用R语言进行单因素被试内ANOVA检验。假设我们的数据存储在一个名为"data"的数据框中,其中包含两个列:一个列是被试的编号,另一个列是生物指标的测量值。在上述代码中,我们创建了一个名为"data"的数据框,其中"Subject"列包含了被试的编号,"Measurement"列包含了生物指标的测量值。参数指定了数据来源。

PixelNovaO的博客 363

数据结构与算法(java):堆

栈

lalala_dxf的博客 1380

基于STM32L4XX的环境光传感器(LTR-303ALS-01)应用程序设计

/ 状态寄存器的位[2:0]表示数据状态,例如位2为1表示新数据就绪[citation:6]#define LTR303_REG_DATA_CH0_LOW 0x8D // CH0数据低字节。#define LTR303_REG_DATA_CH0_HIGH 0x8E // CH0数据高字节。#define LTR303_REG_DATA_CH1_LOW 0x8F // CH1数据低字节。#define LTR303_REG_DATA_CH1_HIGH 0x90 // CH1数据高字节。

myron6688的博客 405

堆的Java实现

一.概念 堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。 堆的特性: 1.它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右不满。保证叶结点只能出现在最下层or次下层 快速辨别: 看最后一层的最后一个结点G,G之前是满的就是完全二叉树。而红色的树 G之前未满,则是不完全二叉树 规律: ①如果一个结点的位置为k,则它的父结点的位置为k/2 , ②而它的两个子结点的位置则分别为2k和2k+1。 这样

机械工程跑路哥 1465

在isaacsim仿真系统进行遥操作(设备是quest3):怎么让遥操作设备(quest3)在Isaac sim系统中控制机械臂并把其中的参数传输出来??

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

**My Coding Family** 943

0基础学习diffusion_model扩散模型【易理解的公式推导】Denoising Diffusion Probabilistic Models

去噪扩散概率模型。本文是笔者在学习扩散模型时的一些笔记与心得,在公式推导过程中能够保证自己是一步一步去推导并且理解了的。概述是我认为比较重要的部分能够帮助理解公式的推导,具体的公式推导在每一小节中进行。1、扩散过程:如上图所示,扩散过程为从右到左X0→XTX0​→XT​的过程,表示对图片逐渐加噪,且Xt1X_{t+1}Xt1​是在XtX_{t}Xt​加躁得到的,其只受XtX_{t}Xt​的影响,因此扩散过程是一个马尔科夫过程。X0X_0。

zik的博客 2402

[JAVA数据结构]堆

java数据结构,堆的介绍

weixin_67719939的博客 3112

《MATLAB项目实战》,专栏目录和介绍

MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具,它提供了一个高效、简洁的编程环境,使用户能够进行从简单的矩阵运算到复杂的多维数据分析的各种计算任务。无论是在人工智能、计算机视觉、图像处理还是其他领域,MATLAB 都能够提供精准、快速的解决方案,因此成为了全球科研人员、工程师以及数据分析师的得力工具。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6478

java 堆实现

java 堆实现 代码 public static void buildheap(int[] a , int heaplength) { for(int i = a.length/2-1; i >= 0; i–) { heapify(a, i, heaplength); } } //小顶堆 public static void heapify(int a[], int i, int hea...

qq_42716518的博客 318

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java中的堆实现

java中的堆实现 如图: 对于java中的堆,我们使用数组来实现 可以看出,通过一个节点在数组中的索引计算出它的父节点及左右孩子节点的索引。 //返回左节点 public int left(int i) { return (i + 1) * 2 - 1; } //返回右节点 public int right(int i) { return (i + 1) * 2; } //返回根节点 public int parent(int i) { // i为根结点 if (i ==

冲冲冲的博客 1156

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

堆(Java实现)

堆,PriorityQueue

2302_81500764的博客 1040

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java 最小堆_Java最小堆实现

package boke.heap1;/*** 堆结点** @since jdk1.5及其以上* @author 毛正吉* @version 1.0* @date 2010.05.24**/public class Node {private int iData; // 结点数据是整型public Node(int key) {iData = key;}/*** setKey** @param i...

weixin_29715563的博客 965

java 最小堆_Java实现最小堆二

Java实现最小堆二如何建立这个堆呢,可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入。因为插入第N个元素的所用的时间是O(logN),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下。n=0;for(i=1;i<=m;i++){n++;h[n]=a[i]; //或者写成scanf("%d",&h[n]);siftup();}其实我们还有更快得方法来建...

weixin_39763033的博客 453

堆的简要分析与实现(Java)

本文简要分析了优先级队列的堆实现方案,简要介绍了大顶堆与小顶堆。

ArrebolMKJ的博客 1537

堆的实现与运用:Java 视角

例如,假设有多个有序数组,可将每个数组的第一个元素放入一个最小堆中,每次从堆顶取出最小元素,然后将该元素所在数组的下一个元素放入堆中,重复此过程,便能有序地合并所有数组。其基本思想是将待排序数组构建成一个最大堆(升序排序时)或最小堆(降序排序时),然后不断将堆顶元素与堆的最后一个元素交换,并对剩余堆进行调整,直到整个堆为空,从而实现数组的排序。- 最小堆:每个非叶子节点的值小于或等于左右子节点的值,即最小堆的根节点是整棵树中的最小值。堆是一种特殊的完全二叉树,主要分为最大堆和最小堆。

2503_90569120的博客 610

一个堆的java实现

写了一个堆的java实现,既然可用数组来表示堆,为了方便,那么就用ArrayList吧。 抽象类Heap: package com.my.test6; import java.util.ArrayList; /** * Title: 堆的抽象实现 * Intention: 参考:https://my.oschina.net/BreathL/blog/71602 * * Class

785

栈、队列、堆的java实现

一、栈 特点:先入后出(FILO)。 代码实现:Java官方建议使用Deque(双端队列)接口实现栈。不要使用Stack类(Vector类子类)实现,效率低。 Deque有两个常用实现类,分别为ArrayDeque(底层数组)和LinkedList(底层链表)。 至于在这两个中如何选择?我认为两者都有优劣。 LinkedList每次在插入或删除一个元素时都涉及到一个Node的创建和销毁,效率较低,并且LinkedList存储结构是不连续的,访问是不能很好的利用CPU缓存。可以插入null。 ArrayD

AmorFati1996的博客 881

数据结构_堆_Java中的实现类

1.数据结构:堆(Heap) https://www.jianshu.com/p/6b526aa481b1 2.Java实现最大堆 https://www.jianshu.com/p/257820688bf1 3.java借助PriorityQueue实现小根堆和大根堆 https://blog.youkuaiyun.com/zcf1784266476/article/details/68961473 我们先来了解下堆的基本概念: 基本概念 堆就是用数组实现的二叉树,所有它...

迎难而上 3321

java数组在堆_Java用数组实现堆

堆:堆是有如下特点的二叉树:1、它是完全二叉树,即树的最后一层不要求是满的,第一个空结点开始的结点,左边所有的兄弟结点必须全部不为空,右边所有结点必须全部为空。2、常常用一个数组来实现。3、堆中每个结点的关键字都大于等于它的孩子结点的关键字。而左右孩子结点间没有强制规定大小关系。所以根据3,我们可以知道,堆是一种弱有序的数据结构。下面用Java实现堆的操作,包括向堆插入结点到堆尾,并进行向上调整,...

weixin_42503008的博客 436

用java实现堆

1、堆是一种特殊的二叉树 堆总是一颗完全二叉树(即除最底层外,其它层节点都被元素填满,且最底层从左向右尽可能填满结点) 2、分为最大堆和最小堆,最大堆中某结点的值总是不大于其父节点的值,最小堆中某结点的值总是不小于其父节点的值 3、堆的实现: 用数组实现 构造二叉树 ArrayList<Integer> array=new ArrayList<Integer>(); //ArrayList<Integer> array=new ArrayLis...

qq_39622795的博客 379

java实现堆_小根堆(最小堆)java实现,完整代码

贡献给有一定java基础的人,啥也不说了,直接上代码了。package org.index;import java.util.ArrayList;import java.util.List;import javax.sound.sampled.ReverbType;public class MinRoot {private Term5Num[] heapArray; // 堆容器private i...

weixin_35143166的博客 713
上一篇: 【刷题笔记/剑指Offer】51-61
下一篇: 【剑指OFFER-二刷】
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值