大顶堆(Max Heap)

2024-01-15 15:20
文章标签 heap max 大顶

本文主要是介绍大顶堆(Max Heap),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大顶堆(Max Heap)

大顶堆是一种特殊的树形数据结构,它满足以下性质:

  • 它是一个完全二叉树:除了最底层外,每一层都被完全填满。在最底层,所有的元素都应该尽可能地靠左排列。

  • 每个节点的值都大于或等于其子节点的值。这就是为什么它被称为大顶堆。

下面是一个大顶堆的示例:

请添加图片描述

上图中,根节点(100)是所有节点中的最大值。同样,每个父节点的值都大于或等于其子节点的值。

好的,下面我将会分别介绍每个部分的代码:

定义变量

int[] array;
int size;

在这里,我们定义了两个成员变量。array 是用来存储堆中的元素的数组,size 是用来表示当前堆的大小。

构造函数

public MaxHeap(int[] array){this.array = array;this.size = array.length;heapify();
}

在构造函数中,我们初始化 arraysize,并调用 heapify() 方法来构建大顶堆。

peek() 方法

public int peek(){if(size == 0)throw new IndexOutOfBoundsException();return array[0];
}

peek() 方法用于获取堆顶元素,也就是堆中的最大值。如果堆为空,则抛出 IndexOutOfBoundsException

pool() 方法

public int pool(){return pool(0);
}

pool() 方法用于删除并返回堆顶元素。这个方法通过调用 pool(int index) 方法实现,参数为0,表示要删除的是堆顶元素。

pool(int index) 方法

public int pool(int index){if(index >= size){throw new IndexOutOfBoundsException();}int i = array[index];array[index] = array[size-1];size--;down(index);return i;
}

pool(int index) 方法用于删除指定索引位置的元素。首先,检查索引是否有效。然后,将要删除的元素保存在 i 中,将堆的最后一个元素移到该位置,并减小堆的大小。最后,调用 down(index) 方法调整堆的结构。

offer(int offered) 方法

public boolean offer(int offered){if (size == array.length)return false;up(offered);size++;return true;
}

offer(int offered) 方法用于向堆中添加一个元素。首先,检查堆是否已满。如果堆未满,将新元素添加到堆的末尾,并调用 up(offered) 方法调整堆的结构。

heapify() 方法

private void heapify(){for (int i = size/2 - 1; i >= 0; i--) {down(i);}
}

heapify() 方法用于将一个数组转换为大顶堆。从数组的一半开始(因为后一半的元素都是叶子节点,没有子节点),对每个元素调用 down(i) 方法。

up(int offered) 和 down(int parent) 方法

private void up(int offered){array[size] = offered;int child = size;int parent = (child - 1) / 2;while (child > 0){if(array[parent] > offered)return;change(parent,child);child = parent;parent = (child -1 ) /2;}
}private void down(int parent){int child1 = parent * 2 + 1;int child2 = parent * 2 + 2;if(child1 >= size)return;int maxIndex = child2 < size && array[child2] > array[child1]? child2:child1;if(array[parent] >= array[maxIndex])return;change(parent,maxIndex);down(maxIndex);
}

up(int offered)down(int parent) 方法用于调整堆的结构。up(int offered) 方法在添加新元素时使用,它将新元素向上移动到正确的位置。down(int parent) 方法在删除元素或构建堆时使用,它将元素向下移动到正确的位置。

change(int parent,int child) 方法

private void change(int parent,int child){int i = array[parent];array[parent] = array[child];array[child] = i;
}

change(int parent,int child) 方法用于交换父节点和子节点的值。

这篇关于大顶堆(Max Heap)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/609347

相关文章

file-max与ulimit的关系与差别

http://zhangxugg-163-com.iteye.com/blog/1108402 http://ilikedo.iteye.com/blog/1554822

POJ 1050 To the Max(枚举+动规)

题目: http://poj.org/problem?id=1050 题解: 此题转化成一维后就相当于求最大连续子序列了,可以枚举所有的行组合,把枚举到的起始行到终止行的值按列相加存入一个一维数组。 代码: #include<cstdio>#include<cstring>int a[101][101];int value[101];int dp[101];int max(

报错:Reached the max session limit(DM8 达梦数据库)

报错:Reached the max session limit - - DM8 达梦数据库 1 环境介绍2 数据库启动SYSTEM IS READY后面日志3 数据库刚启动日志4 达梦数据库学习使用列表 1 环境介绍 某项目无法连接数据库,报错:超过最大会话数限制 , 检查 dmdba ulimit -a openfiles 已改检查 dm.ini 其中 MAX_SESSION

【硬刚ES】ES基础(二十) 单字符串多字段查询:Dis Max Query

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

[LeetCode] 695. Max Area of Island

题:https://leetcode.com/problems/max-area-of-island/description/ 题目 Given a non-empty 2D array grid of 0’s and 1’s, an island is a group of 1’s (representing land) connected 4-directionally (horizont

[LeetCode] 485. Max Consecutive Ones

题: 题目 Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1,1,0,1,1,1]Output: 3Explanation: The first two digits or the last three digits are consec

【UVa】10755 Garbage Heap 三维前缀和

题目分析:将前缀和应用到三维,求最大子矩阵。为S[x][y][z]数组中每个坐标保存从(0,0,0)到(x,y,z)范围内的子矩阵的元素和,最后用多次区间加减法可以得到需要的子矩阵的元素和,再用类似一维求最大连续和的方法求三维最大连续和。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>using

whose UTF8 encoding is longer than the max length 32766

问题描述:java.lang.IllegalArgumentException: Document contains at least one immense term in field=“cf_jg.keyword” (whose UTF8 encoding is longer than the max length 32766) 原因:设置为keyword类型的字段,插入很长的大段内容后,报

MyEclipse中Jboss启动出现Java heap space解决方案

转 http://cst.is-programmer.com/posts/16109.html 在MyEclipse中启动JBOSS,结果报: java.lang.OutOfMemoryError: Java heap space 异常,用jboss中的run.bat启动,则正常运行,而在MyEclipse中启动就报异常,百度之~~得解: 原因是对于很大的Web工程(公司的这个平台

Build Min Heap Using Array

Build min-heap using Array. 思路1:首先明白heap的底层implementation就是array,从0开始的parent和left,right的关系为, 如果现在的node index为i,那么parent index就是 (i-1)/2;   left  为2*i+1, right为 2*i+2;          ( i-1 ) / 2