java实现最小堆

1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质:

  • 任意节点小于它的所有后裔,最小元在堆的根上。
  • 堆总是一棵完全树

  将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

2.最小堆实现:

  插入:

  1)  将新插入的元素,放置到队列的尾部。

  2)  若该元素小于其父节点,两个元素互换。(上移操作)

  3)  迭代,直至该元素没有父节点或小于其父节点。

  删除:

  1)  移掉顶部的节点。

  2)  将队末的元素放置到顶部。

  3)  该节点与其子节点中较小的那个比较,若小于它,则交换位置,(下移操作)

  4)  迭代,直到叶节点或不再比其子节点中较小那个大。

  java code:

 1 package minHeap;
 2
 3public class MinHeap {
 4     private int[] data;
 5
 6     public MinHeap(int[] data) {
 7         this.data = data;
 8     }
 9
10     public void createHeap() {
11         for (int i = (data.length) / 2 - 1; i >= 0; i--) {
12             heapIfy(i);
13         }
14     }
15
16     public void heapIfy(int value) {
17         int lchild = left(value);
18         int rchild = right(value);
19         int smallest = value;
20         if (lchild < data.length && data[lchild] < data[value])
21             smallest = lchild;
22         if (rchild < data.length && data[rchild] < data[smallest])
23             smallest = rchild;
24         if (value == smallest)
25             return;
26         swap(value, smallest);
27         heapIfy(smallest);
28     }
29
30     public int left(int value) {
31         return ((value + 1) << 1) - 1;
32     }
33
34     public int right(int value) {
35         return (value + 1) << 1;
36     }
37
38     public void swap(int i, int j) {
39         int tmp = data[i];
40         data[i] = data[j];
41         data[j] = tmp;
42     }
43
44     public void setRoot(int value) {
45         data[0] = value;
46         heapIfy(0);
47     }
48
49     public static void main(String[] args) {
50         int[] value = { 10, 100, 12, 73, 45, 32, 11, 23, 55, 34, 90, 21 };
51         MinHeap heap = new MinHeap(value);
52         heap.createHeap();
53         for (int i = 0; i < value.length; i++) {
54             System.out.print(heap.data[i] + " ");
55         }
56         System.out.println();
57         heap.setRoot(64);
58         for (int i = 0; i < value.length; i++) {
59             System.out.print(heap.data[i] + " ");
60         }
61         System.out.println();
62     }
63 }

  

  

时间: 2024-11-05 23:28:06

java实现最小堆的相关文章

Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个heap,一个是最小堆,一个是最大堆. 2.一直使maxHeap的size大于minHeap. 3. 当两边size相同时,比较新插入的value,如果它大于minHeap的最大值,把它插入到minHeap.并且把minHeap的最小值移动到maxHeap. ...具体看代码 1 /*********

最小堆和最大堆的JAVA实现

/** * 文件名:BinaryHeap.java * 时间:2014年11月3日下午7:15:34 * 作者:修维康 */ package chapter6; import java.util.*; /** * 类名:BinaryHeap 说明:建立一个最小堆 */ class MinHeap<AnyType extends Comparable<? super AnyType>> { private int currentSize; private static final i

《徐徐道来话Java》:PriorityQueue和最小堆

在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足最小堆的要求,那么,堆顶(根节点)也就是整个序列的最小元素. 最小堆的例子如下图所示: 可以注意到,20的两个子节点31.21,和它们的叔节点30并没有严格的大小要求.以广度优先的方式从根节点开始遍历,可以构成序列: [10,20,30,31,21,32,70] 反过来,可以推演出,序列构成二叉树的

java最小堆实现优先权队列和求最大的n个数问题

堆在实现优先权队列和求最大最小的n个数问题上,有着莫大的优势! 对于最大堆和最小堆的定义此处不再赘述,课参考网上文章:http://blog.csdn.net/genios/article/details/8157031 本文主要是对最小堆进行实现和应用,仅供新手参考. 优先权队列 优先权队列是一种非常有用的数据结构,操作系统的进程调度就有优先权队列的应用,如果用最小值表示最高的优先权,则使用最小堆,否则使用最大堆. top-N值为问题: 对于求最大的n个数,可以用最小堆来实现,思路是:将n个数

Java最小堆解决TopK问题

TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的关键词. 对于这个问题,解决方法有很多: 方法一:对源数据中所有数据进行排序,取出前K个数据,就是TopK. 但是当数据量很大时,只需要k个最大的数,整体排序很耗时,效率不高. 方法二:维护一个K长度的数组a[],先读取源数据中的前K个放入数组,对该数组进行升序排序,再依次读取源数据第K个以后的数据

hdu 4006 The kth great number (优先队列+STB+最小堆)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6637    Accepted Submission(s): 2671 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

java栈内存堆内存和GC相关

java栈内存堆内存 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存,有着不同的作用.栈内存用来存储局部变量和方法调用.栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存.而堆内存中的对象对所有线程可见.堆内存中的对象可以被所有线程访问.而堆内存用来存储Java中的对象.无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中. 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放.而数组

数据结构-最大堆、最小堆【手动实现】

0,堆的简介 数据结构中的堆是一种特殊的二叉树,不同于 Java 内存模型中的堆. 堆必须符合以下两个条件: 是一棵完全二叉树. 任意一个节点的值都大于(或小于)左右子节点的值. 从第一点可以知道,堆适合用数组来存储. 第二点中,若父节点都大于等于左右子节点,则被称为大顶堆,反之则为小顶堆. 图-最大堆及其存储方式 0.1节点的父.子节点关系 一个节点[根节点除外]的父节点地址为其地址的二分之一,它的左子节点地址为其地址值的2倍,右子节点地址为其地址2倍加1.  例如:现在有个节点的地址为3,其

POJ 3784 Running Median (最大最小堆)

最大最小堆动态求中位数 题意:输入M个数,当已输入的个数为奇数个时输出此时的中位数. 一共有M/2+1个中位数要输出,每一行10个. 分析: 用两个优先队列来模拟最大最小堆.中位数是x,就是有一半数比x小,一半数比x大. 刚好符合堆的特点. 用一个从大到小排序的优先队列q1来模拟小于x的数. 从小到大排序的优先队列q2来模拟大于x的数. 动态维护两个优先队列的元素个数.q1.size()=q2.size() 输入的数为偶数个时, q1.size()=q2.size()+1 输入的数为奇数个时.