二叉堆的基本概念与实现
基本概念
二叉堆又名堆,或者优先队列。一般实现在堆顶的元素总是最小的。
二叉堆是一颗用数组实现的完全二叉树。
要实现二叉堆必须满足以下条件:
1堆有序,二叉树中每一个子树的父节点不大于(大根堆)两个子节点。
2树的父节点的两个子节点位置为 2k和2k+1(不使用数组的0号索引),如果使用0号索引,两个子节点的位置为2*k+1和2*k=2。
要实现堆有序,主要依靠上浮(swim)和下沉(snik)两个操作。
在入队时,将数据插入到元素序列尾部,然后将元素上浮到应有的位置。
在出队时,将堆顶最小的元素删除,用元素序列尾部的元素交换到堆顶,然后进行下沉操作,恢复堆有序。
实现
/*** 二叉堆,小堆,降序* @author yuli**/
public class BinaryHeap<T extends Comparable<T>>{private Comparable<T>[] data;private int size;private static final int DEFAULT_CAPACITY = 10; public BinaryHeap() {clean();}public void clean(){size = 0;swap(DEFAULT_CAPACITY);}/*** 添加元素,并将元素上浮* @param t*/public void insert(T t){if(size+1 >= data.length){swap(2*size +1);}//0号位置要空着,所以+了再放元素data[++size] = t;swim(size);}/*** 删除元素,并恢复堆有序* @return*/public Comparable<T> delete(){if(size < 0){System.out.println("没元素啦");return null;}//获得堆顶元素Comparable<T> t = data[1];//将堆顶元素替换成堆底元素data[1] = data[size];//移除堆底元素,顺便把容器的大小-1data[size--] = null;//将交换来的元素下沉到合适的位置,恢复堆的有序性sink(1);return t; }/*** 上浮元素,如果父节点大于子节点,就上浮元素* @param k 元素的索引*/public void swim(int k){//如果子元素不是头结点,并且父节点大于子节点就交换while(k > 1 && less(data[k],data[k/2])){exchange(data, k, k/2);k = k/2;}}private void exchange(Comparable<T>[] t,int v,int w){Comparable<T> temp = t[v];t[v] = t[w];t[w] = temp;}/*** 下沉元素,如果元素的子节点大于父节点,就下沉元素* @param k 元素的索引*/public void sink(int k){while(2*k <= size ){//获取子节点int j = 2*k;//从两个孩子中选出较小那个if(j+1 <= size && !less(data[j],data[j+1])){j++;}//如果子节点不小于父节点就不交换if(less(data[k],data[j])){break;}exchange(data, k, j);k = j;}}/*** v是否比w小* @param v* @param w* @return*/public boolean less (Comparable v,Comparable w){return v.compareTo(w) < 0 ;}/*** 扩容,交换元素* @param newSize*/@SuppressWarnings("unchecked")public void swap(int newSize){if(newSize < size){return;}Comparable<T>[] newItems = new Comparable[newSize];for(int i=0;i<this.size;i++){newItems[i+1]=data[i+1];}this.data = newItems;}
}
二叉堆的基本概念与实现相关推荐
- 【nodejs原理源码杂记(8)】Timer模块与基于二叉堆的定时器
[摘要] timers模块部分源码和定时器原理 示例代码托管在:http://www.github.com/dashnowords/blogs 一.概述 Timer模块相关的逻辑较为复杂,不仅包含Ja ...
- 数据结构之优先队列--二叉堆(Java实现)
前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...
- 关于二叉堆(优先队列)的其他操作及其应用
[0]README 0.1)本文总结于 数据结构与算法分析:源代码均为原创, 旨在了解到我们学习了优先队列后,还能干些什么东西出来, 增加学习的interest: 0.2)以下列出了 关于二叉堆(优先 ...
- 图解:什么是二叉堆?
在正式开始学习堆之前,一定要大脑里回顾一下什么是完全二叉树,因为它和堆可是息息相关奥! 如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树. 而如果二叉树中除去最后一层节点为满二叉 ...
- java实现二叉堆,数据结构基础篇-二叉堆
二叉堆分为两种,最大堆和最小堆,我们只讨论最小堆的性质,最大堆具有相同的原理. 最小堆是一种符合下面两个特性的树形结构: 最小堆是一颗完全二叉树,即最小堆的每个节点要么没有子节点,要么只有一个左子节点 ...
- 【数据结构与算法拓展】二叉堆原理、实现与例题(C和java)
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...
- unity3d:Astar寻路,A星,A*,二叉堆优化Open表
原理视频 油管:https://youtu.be/i0x5fj4PqP4 别人的B站翻译:https://www.bilibili.com/video/BV1v44y1h7Dt?spm_id_from ...
- 二叉堆--insert操作以及deleteMin操作的实现(C语言)
二叉堆--insert操作以及deleteMin操作的实现(C语言) 一.概念回顾 1. 什么是二叉堆? 二叉堆其实就是一棵完全二叉树,但是它相比一般的完全二叉树又多了一些限制: (1)对于二叉堆来说 ...
- 大根堆的删除c语言,二叉堆(一)之 C语言详解
本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...
最新文章
- Win32 控件篇(3)
- mysql2008无法启动_SQL Server 2008突然无法正常启动
- C# 类中继承接口的属性
- c语言 int64 t占位符,为什么我会得到“您必须为dtype int64提供占位符张量输出值”?...
- tp5.0路由route.php,thinkphp5.1使用Route路由
- 06-Mapper动态代理
- 卷积神经网络在tenserflow的实现
- 一道自创的招聘测试题
- android 实现蓝牙自动配对连接,Android实践 -- Android蓝牙设置连接
- 用户启动计算机并登录win7,win7电脑设置开机登录界面的方法?
- matlab 调和级数作图,华工数学实验报告斐波那契数列.doc
- Java中的private关键字
- nginx 499状态码
- 分时线的9代表什么_一位从亏损到稳赚的老股民告诉你:为什么要打板?
- 几款软件界面模型设计工具
- 计算机硬盘解密,如何解除电脑硬盘密码 解除电脑硬盘密码方法【详解】
- App Designer中自建回调函数
- 抓住金三银四的尾巴,解锁程序员面试《刷题神器》
- PLC可编程控制器控制热水供暖循环系统实训
- 2021-02-05仅供自己参考:多态使用