java实现最小堆
1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质:
- 任意节点小于它的所有后裔,最小元在堆的根上。
- 堆总是一棵完全树
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
2.最小堆实现:
插入:
1) 将新插入的元素,放置到队列的尾部。
2) 若该元素小于其父节点,两个元素互换。(上移操作)
3) 迭代,直至该元素没有父节点或小于其父节点。
删除:
1) 移掉顶部的节点。
2) 将队末的元素放置到顶部。
3) 该节点与其子节点中较小的那个比较,若小于它,则交换位置,(下移操作)
4) 迭代,直到叶节点或不再比其子节点中较小那个大。
java code:
package minHeap;
public class MinHeap {
private int[] data;
public MinHeap(int[] data) {
this.data = data;
}
public void createHeap() {
for (int i = (data.length) / 2 - 1; i >= 0; i--) {
heapIfy(i);
}
}
public void heapIfy(int value) {
int lchild = left(value);
int rchild = right(value);
int smallest = value;
if (lchild < data.length && data[lchild] < data[value])
smallest = lchild;
if (rchild < data.length && data[rchild] < data[smallest])
smallest = rchild;
if (value == smallest)
return;
swap(value, smallest);
heapIfy(smallest);
}
public int left(int value) {
return ((value + 1) << 1) - 1;
}
public int right(int value) {
return (value + 1) << 1;
}
public void swap(int i, int j) {
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
public void setRoot(int value) {
data[0] = value;
heapIfy(0);
}
public static void main(String[] args) {
int[] value = { 10, 100, 12, 73, 45, 32, 11, 23, 55, 34, 90, 21 };
MinHeap heap = new MinHeap(value);
heap.createHeap();
for (int i = 0; i < value.length; i++) {
System.out.print(heap.data[i] + " ");
}
System.out.println();
heap.setRoot(64);
for (int i = 0; i < value.length; i++) {
System.out.print(heap.data[i] + " ");
}
System.out.println();
}
}
java实现最小堆的更多相关文章
- java最大最小堆
堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...
- c++/java/python priority_que实现最大堆和最小堆
#include<iostream>#include<vector>#include<math.h>#include<string>#include&l ...
- Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java
Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个h ...
- 【Java】 用PriorityQueue实现最大最小堆
PriorityQueue(优先队列),一个基于优先级堆的无界优先级队列. 实际上是一个堆(不指定Comparator时默认为最小堆),通过传入自定义的Comparator函数可以实现大顶堆. Pri ...
- 《徐徐道来话Java》:PriorityQueue和最小堆
在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...
- heapsort(Java)(最小堆)
public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextI ...
- Java最小堆解决TopK问题
TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的 ...
- java栈内存堆内存和GC相关
java栈内存堆内存 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存,有着不同的作用.栈内存用来存储局部变量和方法调用.栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属 ...
- C++实现最小堆及插入,调整顺序,删除堆顶元素的操作
上次用Java实现了最大堆的封装,这次就来写一下最小堆的实现吧 插入函数的思路: 向堆中插入元素有两种情况,一种是堆为空,那么就让插入值作为根节点即可:另一种是堆不为空,那么此时就要进行判断当前节点与 ...
随机推荐
- POJ 3159 Candies (图论,差分约束系统,最短路)
POJ 3159 Candies (图论,差分约束系统,最短路) Description During the kindergarten days, flymouse was the monitor ...
- Luogu 1613 跑路(最短路径,倍增)
Luogu 1613 跑路(最短路径,倍增) Description 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是 ...
- QeePHP View视图的默认变量与新增变量
新版本的QeePHP(V13.1)中,视图页面已经默认添加了几个常用变量 $_app; //控制器所属的应用程序 $_login_user; //登陆用户信息 直接在视图页面直接使用变量即可. 如果 ...
- div 内table 居中实现代码
有时候在一个div里面添加一个表格,如想让它居住排列,需要做如下的操作. css代码: 代码如下: #dlgReply { /*display: table-cell; text-align: c ...
- Zookeeper可视化工具
zkui 简介 zkui它提供了一个管理界面,可以针对zookeepr的节点值进行CRUD操作,同时也提供了安全认证. 下载安装 项目地址 下载 $ git clone https://github. ...
- OpenStack 图形化服务 Horizon使用(十三)
构建一台云主机 上图中Count可以选择同时创建多台 最终“启动实例” 创建成功后,可以进入控制台,操作新建云主机
- MVC、MVP和MVVM浅谈
MVC是最经典的开发模式之一,最早是后台那边来的,后台前端的复杂度也上来了,MVC的开发模式也带进前端了. MVC: MVC有两个很明显的问题: 1.m层和v层直接打交道,导致这两层耦合度高 2.因为 ...
- Python常用模块-随机数模块(random)
Python常用模块-随机数模块(random) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用方法举例 #!/usr/bin/env python #_*_coding: ...
- Java远程访问接口的几种方式
一.Java访问远程url接口并获取结果 1.原生JavaAPI获取 package com.util; import java.io.DataOutputStream; import java.io ...
- 优雅地搭建整合ssm项目
spring + spring mvc + mybatis 三大框架建议观看 黑马程序员出品的 Springmvc+Mybatis由浅入深全套视频教程 Spring框架2016版视频 观看顺序 ,我个 ...