java数据结构堆_Java 数据结构-堆实现
堆的定义:有如下性质的完全二叉树:任意节点X所处的项的关键字大于或等于以X为根的子数中的所有节点出的项的关键字。
意义在于,在数据结构中,其常常被用作优先级队列的结构,其意义是每次从队列中获取的元素,总是最满足某个条件的;比如最大的元素;再例如先进先出队列所满足的特定条件就是,具备放入队列时间最早的那个元素。
堆实现的主要操作就是 插入和 删除(移除并获取那个最符合条件的元素)。先简单描述下逻辑
插入:1.将新插入的元素,放置到队列的尾部。
2.若该元素大于其父节点,两个元素互换。(上移操作)
3.循环第2步,直至该元素没有父节点或小于其父节点。
删除:1.移掉顶部的节点。
2.将队末的元素放置到顶部。
3.该节点与其子节点中较大的那个比较,若小于它,则交换位置,(下移操作)
4.循环第3步,直到叶节点或不再比其子节点中较大那个小。
若是最小堆,比较都反过来。
在实现的中,用ArrayList作为其内部容器,首先因为ArrayList基于数组,方便快速定位,父节点与子节点的关系只需要计算下就可以得出: 【2*index + 1 】或【 (index -1)/2】, 其次ArrayList以及自动实现了写基础操作,扩容、判空、容器大小等。下面是代码,若有更好的实现,欢迎指点 :)
public class Heap> {
ArrayList items;
int cursor; //用于计数
public Heap(int size){
items = new ArrayList(size);
cursor = -1;
}
public Heap(){
items = new ArrayList();
cursor = -1;
}
/**
* 上移操作
* @param index 被上移元素的起始位置。
*/
void siftUp(int index){
T intent = items.get(index);
while(index > 0){
int pindex = (index - 1)/2;
T parent = items.get(pindex);
if(intent.compareTo(parent) > 0){//上移的条件,比父节点大
items.set(index, parent);
index = pindex;
}else break;
}
items.set(index, intent);
}
/**
* 下移操作
* @param index 被下移的元素的起始位置
*/
void siftDown(int index){
T intent = items.get(index);
int l_index = 2*index +1;
while(l_index < items.size()){
T maxChild = items.get(l_index);
int max_index = l_index;
int r_index = l_index + 1;
if(r_index < items.size()){
T rightChild = items.get(r_index);
if(rightChild.compareTo(maxChild) > 0){
maxChild = rightChild;
max_index = r_index;
}
}
if(maxChild.compareTo(intent) > 0){
items.set(index, maxChild);
index = max_index;
l_index = index * 2 + 1 ;
}else break;
}
items.set(index, intent);
}
public void add (T item){
//先添加到最后
items.add(item);
//循环上移,以完成重构
siftUp(items.size() -1);
}
public T deleteTop(){
if(items.isEmpty()){
throw new NoSuchElementException();
}
//先获取顶部节点
T maxItem = items.get(0);
T lastItem = items.remove(items.size() -1 );
if(items.isEmpty()){
return lastItem;
}
//将尾部的节点放置顶部,下移,完成重构
items.set(0, lastItem);
siftDown(0);
return maxItem;
}
public T next(){
if(cursor < 0 || cursor == (items.size() -1)){
return null;
}
cursor++;
return items.get(cursor);
}
public T first(){
if (items.size() == 0 ) return null;
cursor = 0;
return items.get(0);
}
public boolean isEmpty(){
return items.isEmpty();
}
public int size(){
return items.size();
}
public void clear(){
items.clear();
}
}
原创博客,转载请注明
http://my.oschina.net/BreathL/blog/71602
java数据结构堆_Java 数据结构-堆实现相关推荐
- java数据结构教程_Java数据结构
Java实用程序包提供的数据结构非常强大,可以执行各种功能. 这些数据结构由以下接口和类组成 - Enumeration BitSet Vector Stack Dictionary Hashtabl ...
- java 反射 静态域_java 内存 堆 栈
本文主要通过分析Java内存分配的栈.堆以以及常量池详细的讲解了其的工作原理. 一.Java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而 ...
- java 最小堆_Java最小堆实现
package boke.heap1; /** * 堆结点 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.05.24 ...
- java 数据结构 无向图_Java数据结构和算法(十五)——无权无向图
前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做"树"是因为它看起来像一棵倒挂的树,包括二叉树.红黑树.2-3- ...
- java数据结构 队列_Java数据结构与算法[原创]——队列
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...
- java静态方法 问题_Java中堆、栈,静态方法和非静态方法的速度问题
一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆 ...
- java 头尾 队列_Java数据结构之队列(动力节点Java学院整理)
队列的定义: 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中 ...
- java 数据队列_Java 数据结构 - 队列
Java 数据结构 - 队列 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的. 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构.使用队列时,在一端插入元素,而在另一 ...
- java link 使用_Java数据结构之简单的连接点(link)实现方法示例
本文实例讲述了Java数据结构之简单的连接点(link)实现方法.分享给大家供大家参考,具体如下: 一.概述: 链接点由:数据和指向下个数据的指针构成 如图: 二.简单实现: package com. ...
最新文章
- 软件架构是软件的组织形式
- python读取大文件-python如何读取大文件以及分析时的性能优化小技巧
- ASP.NET Core 基于声明的访问控制到底是什么鬼?
- tcpcopy使用方法
- 关于a元素href的注意点
- 用sqoop从mysql导数hive_使用sqoop从mysql导入到hive基本操作
- ElasticSearch学习笔记(二)
- python 读取json与xml格式化等处理
- vue使用a标签下载文件_vue+iview 通过a标签实现文件下载
- 电阻参数_电阻的基础知识和参数介绍
- 查询快递单号物流,自动识别出物流是否签收
- Fully Convolutional Cross-Scale-Flows for Image-based Defect Detection
- citrix vdi 服务器性能要求,如何评估VDI存储要求
- 可以免费打电话的网站
- Cheat Engine游戏脚本修改器通关教程(脑残版Step9)
- Axure 制作验证码交互
- Orleans 2.0 官方文档 —— 4.5 Grains - 观察者
- Flutter3引用原生播放器-IOS(Swift)篇
- 美国三大航空公司均取消国内航班改签费
- C语言-函数(详尽版)
热门文章
- android api24如何使用uri,URI API(地图调起)
- Nature综述:从土壤到临床-微生物次级代谢产物对抗生素耐受性和耐药性的影响...
- ​Microbiome:海南大学张家超、Rob Knight等揭示益生菌在宿主肠道内适应性进化规律...
- 【震惊】漱口水居然增加糖尿病,高血压发病率
- 你知道R中的赋值符号箭头和等号的区别吗?
- js弹出一段html,html js 弹出层
- python使用matplotlib可视化余弦曲线cosine、使用plot函数可视化余弦曲线
- R语言psych包的corr.test函数计算相关性并给出所有相关性的显著性(Correlation matrix and tests of significance via corr.test())
- R语言使用hexSticker包将lattice包可视化的结果转换为六角图(六角贴、六角形贴纸、lattice plot to hex sticker)
- R语言生成组合图并保存实战:实际上只保存了最后一个图问题、ggsave生成组合图并保存(保存完整组合图)