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 id
*/
public void setKey(int id) {
iData = id;
}
/**
* getKey
*
* @return
*/
public int getKey() {
return iData;
}
}
2. 最小堆
package boke.heap1;
import boke.heap.Node;
/**
* 最小堆
*
* @since jdk1.5及其以上
* @author 毛正吉
* @version 1.0
* @date 2010.05.24
*
*/
public class MinHeap {
private Node[] heapArray; // 堆容器
private int maxSize; // 堆得最大大小
private int currentSize; // 堆大小
public MinHeap(int _maxSize) {
maxSize = _maxSize;
heapArray = new Node[maxSize];
currentSize = 0;
}
/**
* 自上而下调整
*
* @param start
* @param endOfHeap
*/
public void filterDown(int start, int endOfHeap) {
int i = start;
int j = 2 * i + 1; // j是i的左子女位置
Node temp = heapArray[i];
while (j <= endOfHeap) { // 检查是否到最后位置
if (j < endOfHeap // 让j指向两子女中的小者
&& heapArray[j].getKey() > heapArray[j + 1].getKey()) {
j++;
}
if (temp.getKey() <= heapArray[j].getKey()) { // 小则不做调整
break;
} else { // 否则小者上移,i,j下降
heapArray[i] = heapArray[j];
i = j;
j = 2 * j + 1;
}
}
heapArray[i] = temp;
}
/**
* 自下而上的调整:从结点start开始到0为止,自下向上比较,如果子女的值小于双亲结点的值则互相交换
*
* @param start
*/
public void filterUp(int start) {
int j = start;
int i = (j - 1) / 2;
Node temp = heapArray[j];
while (j > 0) { // 沿双亲结点路径向上直达根节点
if (heapArray[i].getKey() <= temp.getKey()) {// 双亲结点值小,不调整
break;
} else {// 双亲结点值大,调整
heapArray[j] = heapArray[i];
j = i;
i = (i - 1) / 2;
}
heapArray[j] = temp; // 回送
}
}
/**
* 堆中插入结点
*
* @param key
* @return
* @throws MinHeapException
*/
public boolean insert(int key) throws MinHeapException {
boolean bool = true;
if (isFull()) {
bool = false;
throw new MinHeapException("MinHeap is full!");
} else {
Node newNode = new Node(key);
heapArray[currentSize] = newNode;
filterUp(currentSize);
currentSize++;
}
return bool;
}
/**
* 删除堆中的最小值
*
* @return
* @throws MinHeapException
*/
public Node removeMin() throws MinHeapException {
if (isEmpty()) {
throw new MinHeapException("MinHeap is empty!");
}
Node root = heapArray[0];
heapArray[0] = heapArray[currentSize - 1];
currentSize--;
filterDown(0, currentSize - 1);
return root;
}
/**
* 按某种格式输出堆
*/
public void displayHeap() {
System.out.print("heapArray: ");
for (int i = 0; i < currentSize; i++) {
if (heapArray[i] != null) {
System.out.print(heapArray[i].getKey() + " ");
} else {
System.out.print("-- ");
}
}
System.out.println();
int nBlanks = 32; // heap format
int itemsPerRow = 1;
int column = 0;
int j = 0; // current item
String dots = "...............................";
System.out.println(dots + dots); // dotted top line
while (currentSize > 0) { // for each heap item
if (column == 0) { // first item in row
for (int k = 0; k < nBlanks; k++) { // preceding blanks
System.out.print(" ");
}
}
System.out.print(heapArray[j].getKey()); // display item
if (++j == currentSize) { // done?
break;
}
if (++column == itemsPerRow) { // end of row?
nBlanks /= 2; // half the blanks
itemsPerRow *= 2; // twice the items
column = 0; // start over on
System.out.println(); // next row
} else { // next item on row
for (int k = 0; k < nBlanks * 2 - 2; k++) {
System.out.print(' '); // interim blanks
}
}
}
System.out.println("\n" + dots + dots);
}
public boolean isEmpty() {
return currentSize == 0;
}
public boolean isFull() {
return currentSize == maxSize;
}
public void makeEmpty() {
currentSize = 0;
}
}
3. 堆异常
package boke.heap1;
/**
* 堆异常
*
* @since jdk1.5及其以上
* @author 毛正吉
* @version 1.0
* @date 2010.05.24
*
*/
public class MinHeapException extends Exception {
public MinHeapException() {
super("MinHeapException");
}
public MinHeapException(String exMsg) {
super(exMsg);
}
}
4. 最小堆应用测试
package boke.heap1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 最小堆应用测试
*
* @since jdk1.5及其以上
* @author 毛正吉
* @version 1.0
* @date 2010.05.24
*
*/
public class MinHeapApp {
/**
* @param args
* @throws IOException
* @throws MinHeapException
*/
public static void main(String[] args) throws IOException, MinHeapException {
int value, value2;
MinHeap hp = new MinHeap(31);
boolean success;
hp.insert(53);
hp.insert(17);
hp.insert(78);
hp.insert(9);
hp.insert(45);
hp.insert(65);
hp.insert(87);
hp.insert(23);
while (true) {
System.out.print("Enter first letter of ");
System.out.print("show, insert, remove: ");
int choice = getChar();
switch (choice) {
case 's':
hp.displayHeap();
break;
case 'i':
System.out.print("Enter value to insert: ");
value = getInt();
success = hp.insert(value);
if (!success) {
System.out.println("Can't insert; heap is full");
}
break;
case 'r':
if (!hp.isEmpty()) {
hp.removeMin();
} else {
System.out.println("Can't remove; heap is empty");
}
break;
default:
System.out.println("Invalid entry\n");
}
}
}
/**
* 获得控制台输入流
*
* @return
* @throws IOException
*/
public static String getString() throws IOException {
return new BufferedReader(new InputStreamReader(System.in)).readLine();
}
/**
* 获得控制台输入字符
*
* @return
* @throws IOException
*/
public static char getChar() throws IOException {
return getString().charAt(0);
}
/**
* 获得控制台输入整型
*
* @return
* @throws NumberFormatException
* @throws IOException
*/
public static int getInt() throws NumberFormatException, IOException {
return Integer.parseInt(getString());
}
}
分享到:
2010-05-31 08:29
浏览 5419
论坛回复 / 浏览 (4 / 6422)
评论
4 楼
maozj
2010-06-01
zwhc 写道
对 hashtable 做个封装不行吗?
呵呵 可试试
3 楼
zwhc
2010-05-31
对 hashtable 做个封装不行吗?
2 楼
maozj
2010-05-31
路在转角处 写道
看懂了,是数据结构
呵呵 程序可以运行测试一下,那样更直观
1 楼
路在转角处
2010-05-31
看懂了,是数据结构
java 最小堆_Java最小堆实现相关推荐
- java 反射 静态域_java 内存 堆 栈
本文主要通过分析Java内存分配的栈.堆以以及常量池详细的讲解了其的工作原理. 一.Java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而 ...
- java数据结构堆_Java 数据结构-堆实现
堆的定义:有如下性质的完全二叉树:任意节点X所处的项的关键字大于或等于以X为根的子数中的所有节点出的项的关键字. 意义在于,在数据结构中,其常常被用作优先级队列的结构,其意义是每次从队列中获取的元素, ...
- java静态方法 问题_Java中堆、栈,静态方法和非静态方法的速度问题
一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆 ...
- 堆之最小堆、最大堆(java实现)
文章目录 堆 图解 最大堆的api设计 最大堆代码实现 最小代码实现 堆 定义:堆是树型的一对多的数据结构,使用数组实现 对应完全二叉树 每个节点大于等于或者小于等于它的子节点 二叉树: 每个非叶子节 ...
- java堆内与堆外数据交互_Java:汇总堆外数据
java堆内与堆外数据交互 探索如何以最小的垃圾回收影响和最大的内存利用率创建堆外聚合. 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销. 这也意味着,一旦聚合超 ...
- java堆和非堆_java 堆与非堆 内存
堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的.&q ...
- 利用二叉堆实现最小优先队列
利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...
- 【高性能定时器】时间堆(最小堆)
最小堆及其应用:时间堆 最小堆及其应用:时间堆 一. 堆 1. 概念 2. 最小堆的实现 3. 性质 4. 代码 二.时间堆 1. 概念简述 2. 实现细节 3. 代码 一. 堆 1. 概念 堆是一种 ...
- 最小堆实现最小优先队列
最小优先队列的可以实现的操作: insert,插入一个元素 min,找到最小的元素 extract-min,去掉最小的元素并返回最小的元素 increase-key,增加一个关键字的值 优先队列的形式 ...
最新文章
- 脚本程序转变为可执行程序的第三方库——pyinstaller
- 记录一个班级的成绩练习一维数组
- java添加删除用户信息泄露_java删除用户404错误!!神奇!增改查都没问题啊!!...
- android theme 错误,为什么修改android:theme就崩溃,求助
- python数据库管理软件_数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接 - Python社区...
- 开课吧课堂:finally如何使用?作用是什么?
- python简单代码-Python中几个非常神奇的代码的简洁,方便,高效!
- 【Scratch案例实操】scratch我们爱编程 scratch编程案例教学 scratch创意编程 少儿编程教案
- c#IntPtr简例
- 哈尔滨工业大学计算机系统大作业计算机系统大作业
- 工业控制计算机固态硬盘,工业级固态硬盘的标准有哪几类
- d3.js d3.scale.ordinal() --详解 rangeBands
- python爬取“堆糖网”小姐姐 图片
- KVM虚拟机扩容硬盘
- svg模糊_SVG的运动模糊效果
- 2021年N1叉车司机考试报名及N1叉车司机复审考试
- oracle备份数据库的格式,ORACLE 数据库备份文件的后缀是()。
- 科林明伦杯 - B Time
- 哪个牌子的儿童护眼灯好?分享315护眼灯合格名单的护眼台灯
- TCAM路由器查表技术分析
热门文章
- json.decoder.JSONDecodeError: Expecting value: line 28 column 5 (char 731)
- 概率图模型中信念传播
- Workshop | 超高效的设计方法你GET了吗?Design Sprint设计冲刺工作坊
- Python 的装饰器执行顺序问题(二)
- 泰一指尚大数据应用成为第一批省级重点企业研究院
- 记一个鼠标略过时候的css动画
- 用Python实现每秒处理120万次HTTP请求
- 企业移动办公市场格局将定 随办如何突围?
- Android Studio 模拟器 不要皮肤,效果更好
- Java中sleep,wait,yield,join的区别