堆的定义:有如下性质的完全二叉树:任意节点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 数据结构-堆实现相关推荐

  1. java数据结构教程_Java数据结构

    Java实用程序包提供的数据结构非常强大,可以执行各种功能. 这些数据结构由以下接口和类组成 - Enumeration BitSet Vector Stack Dictionary Hashtabl ...

  2. java 反射 静态域_java 内存 堆 栈

    本文主要通过分析Java内存分配的栈.堆以以及常量池详细的讲解了其的工作原理. 一.Java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而 ...

  3. java 最小堆_Java最小堆实现

    package boke.heap1; /** * 堆结点 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.05.24 ...

  4. java 数据结构 无向图_Java数据结构和算法(十五)——无权无向图

    前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做"树"是因为它看起来像一棵倒挂的树,包括二叉树.红黑树.2-3- ...

  5. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  6. java静态方法 问题_Java中堆、栈,静态方法和非静态方法的速度问题

    一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆 ...

  7. java 头尾 队列_Java数据结构之队列(动力节点Java学院整理)

    队列的定义: 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中 ...

  8. java 数据队列_Java 数据结构 - 队列

    Java 数据结构 - 队列 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的. 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构.使用队列时,在一端插入元素,而在另一 ...

  9. java link 使用_Java数据结构之简单的连接点(link)实现方法示例

    本文实例讲述了Java数据结构之简单的连接点(link)实现方法.分享给大家供大家参考,具体如下: 一.概述: 链接点由:数据和指向下个数据的指针构成 如图: 二.简单实现: package com. ...

最新文章

  1. 软件架构是软件的组织形式
  2. python读取大文件-python如何读取大文件以及分析时的性能优化小技巧
  3. ASP.NET Core 基于声明的访问控制到底是什么鬼?
  4. tcpcopy使用方法
  5. 关于a元素href的注意点
  6. 用sqoop从mysql导数hive_使用sqoop从mysql导入到hive基本操作
  7. ElasticSearch学习笔记(二)
  8. python 读取json与xml格式化等处理
  9. vue使用a标签下载文件_vue+iview 通过a标签实现文件下载
  10. 电阻参数_电阻的基础知识和参数介绍
  11. 查询快递单号物流,自动识别出物流是否签收
  12. Fully Convolutional Cross-Scale-Flows for Image-based Defect Detection
  13. citrix vdi 服务器性能要求,如何评估VDI存储要求
  14. 可以免费打电话的网站
  15. Cheat Engine游戏脚本修改器通关教程(脑残版Step9)
  16. Axure 制作验证码交互
  17. Orleans 2.0 官方文档 —— 4.5 Grains - 观察者
  18. Flutter3引用原生播放器-IOS(Swift)篇
  19. 美国三大航空公司均取消国内航班改签费
  20. C语言-函数(详尽版)

热门文章

  1. android api24如何使用uri,URI API(地图调起)
  2. Nature综述:从土壤到临床-微生物次级代谢产物对抗生素耐受性和耐药性的影响...
  3. ​Microbiome:海南大学张家超、Rob Knight等揭示益生菌在宿主肠道内适应性进化规律...
  4. 【震惊】漱口水居然增加糖尿病,高血压发病率
  5. 你知道R中的赋值符号箭头和等号的区别吗?
  6. js弹出一段html,html js 弹出层
  7. python使用matplotlib可视化余弦曲线cosine、使用plot函数可视化余弦曲线
  8. R语言psych包的corr.test函数计算相关性并给出所有相关性的显著性(Correlation matrix and tests of significance via corr.test())
  9. R语言使用hexSticker包将lattice包可视化的结果转换为六角图(六角贴、六角形贴纸、lattice plot to hex sticker)
  10. R语言生成组合图并保存实战:实际上只保存了最后一个图问题、ggsave生成组合图并保存(保存完整组合图)