堆(一)最大堆和最小堆的实现
最大堆和最小堆的实现
这一讲讲的还是堆,因此将它归入到堆(一)中。这一篇博客的目的非常简单,就是补充一下堆的实现代码。Heap是抽象类,它有两个子类,MaxHeap和MinHeap。回顾一下堆的性质:
最大堆:堆中每一个元素(root除外)都满足,A[parent(i)] >= A[i]. (A为堆, A[i]为相应元素)。
最小堆:堆中每一个元素(root除外)都满足,A[parent(i)] <= A[i]. (A为堆, A[i]为相应元素)。
Heap
Heap,代码如下,它是一个抽象的父类。两个最重要的方法是buildHeap和heapify。
heapify方法:在一个最大堆中,改变元素i的值,为了保持最大堆性质,而调用这个方法。时间复杂度是O(h),h为元素i的高度。
buildHeap方法:从底部元素开始,自底向上构建最大堆。时间复杂度是O(n).
其中,heapify方法由子类重写。
package heap;public abstract class Heap {int[] items;int heapSize;Heap(int capacity) {items = new int[capacity];}// 根据Max或者Min而变化private void buildHeap() {heapSize = items.length;for (int i = heapSize/2-1; i > -1;i--) {heapify(i);}}// 根据Max或者Min而变化protected abstract void heapify(int i);int left(int i) {return 2*i+1;}int right(int i) {return 2*i+2;}
}
MinHeap
实现了minHeapify方法。
package heap;public class MinHeap extends Heap{public MinHeap(int capacity) {super(capacity);}@Overrideprotected void heapify(int i) {int l = left(i);int r = right(i);int smallest = i;if (l < heapSize && items[l] < items[smallest]) smallest = l;if (r < heapSize && items[r] < items[smallest]) smallest = r;if (smallest != i) {int tmp = items[smallest];items[smallest] = items[i];items[i] = tmp;heapify(smallest);}}
}
MaxHeap
package heap;public class MaxHeap extends Heap {public MaxHeap(int capacity) {super(capacity);}@Overrideprotected void heapify(int i) {int l = left(i);int r = right(i);int largest = i;if (l < heapSize && items[l]>items[largest]) largest = l;if (r < heapSize && items[r]>items[largest]) largest = r;if (largest != i) {int tmp = items[i];items[i] = items[largest];items[largest] = tmp;heapify(largest);}}}
堆(一)最大堆和最小堆的实现相关推荐
- C++判断一个序列是否为堆(最大堆、最小堆)
参考:https://blog.csdn.net/guoweimelon/article/details/50904346 1.如何判断一个序列是不是堆? 把这个序列看成是数组型的二叉树,如果根节点是 ...
- 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理
二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...
- 深入理解堆(最大堆,最小堆及堆排序)
基本概念: 1.完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树. 2.满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值. ...
- Java实现堆,最大堆,最小堆,左高树,左低树
MyList.LinearList参见链接 MyTree.TreeNode参见链接 #Heap package MyHeap;public interface Heap {abstract publi ...
- 最大堆和最小堆(数据结构)
堆和栈的区别: 一.空间分配区别: 栈(操作系统):由操作系统自动分配释放,存放函数的参考值,局部变量的值等.其操作方式类似于数据结构中的栈 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序 ...
- 最大堆、最小堆的建立、插入和删除操作
堆数的定义 堆树的定义如下: (1)堆树是一颗完全二叉树: (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值: (3)堆树中每个节点的子树都是堆树. 当父节点的键值总是大于或等于任何一个子节点 ...
- 最大堆,最小堆插入/删除以及最大堆的排序
先说一下最大堆如何排序:转自:http://www.cnblogs.com/luchen927/archive/2012/03/08/2381446.html 最大堆和最小堆在算法中也有运用.比如用最 ...
- 最大堆和最小堆和平衡二叉树_最小堆二叉树
最大堆和最小堆和平衡二叉树 A Min Heap Binary Tree is a Binary Tree where the root node has the minimum key in the ...
- 2020 C++ priority_queue 最大堆与最小堆介绍
文章目录 1.问题描述 2.具体分析 3.其他方式 4.用最小堆解决问题 1.问题描述 通常在刷题的时候,会遇到最大堆.最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何 ...
最新文章
- LOADRUNNER 登陆功能测试实例(转)
- 慕课网之JavaScript-confirm
- MR作业提交时指定第三方依赖jar
- CentOS ASP.NET Core Runtime Jexus跨平台布署
- 点云数据显示_vispy 显示 kitti 点云数据
- PHP无法执行MySQL语句,解决PHP执行批量MySQL语句的问题
- python 制定识别图片的某些区域_python批量识别图片指定区域文字内容
- c++课程学习(未完待续)
- Broadwell I7-5775c/5675c BSOD 蓝屏问题
- 【iVX从入门到精通 · 开篇】初始iVX——零代码的可视化编程语言
- web前端大作业:游戏动漫网页设计(HTML+CSS+JavaScript)
- 2021五一数学建模B题思路
- python pyhook_python使用pyHook.HookManager()返回来的event中,event.Time肿么转换成为datetime形式?...
- Lorenz系统的吸引子相图
- GNU autotools 下载和安装
- 计算机一级打字要注意什么,用键盘打字时要注意什么 怎样用键盘来练习打字...
- java locale string_java.lang.String.toUpperCase(Locale locale)方法实例
- JQuery移动动画实现点击按钮切换图片--JQuery基础
- 银行钱数(带小数位)转大写
- iPhone13外部拨打电话总是暂时无法接通解决方案
热门文章
- ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)
- 单点登录系统【All登录系统优化】
- 德玛西亚之WorkFlow(五)流程引擎创建
- 微信公众号实现无限制推送模板消息之免开发的玩法!
- 关于JAVA Bean实体类对象pojo,vo,po,dto,entity之间的区别
- xp系统打印机服务器报错,XP系统使用打印机弹出Spoolsv.exe 应用程序错误怎么办...
- CV和Resume到底是什么,有什么差别?
- oracle子库存转移项目转移,是什么原因呢?物料可以做子库存转移?
- ubuntu 14.04 截屏快捷键
- 牛市来了?这几款开源项目让你的交易更加得心应手