基本数据结构之BinaryHeap

问题描述:

BinaryHeap

问题分析:

基本实现

代码实现:

package C06;
/**
 * @project: DataStructureAndAlgorithmAnalysis
 * @filename: BinaryHeap.java
 * @version: 0.10
 * @author: JM Han
 * @date: 21:51 2015/10/24
 * @comment: BinaryHeap
 * @result:
 */

import master.UnderflowException;
import org.omg.CORBA.Any;

import static tool.util.*;

public class BinaryHeap<AnyType extends Comparable<? super AnyType>> {

   public BinaryHeap(){
      this(DEFAULT_CAPACITY);
   }

   public BinaryHeap(int Capacity){
      currentSize = 0;
      array = (AnyType[]) new Comparable[Capacity + 1];
   }

   public BinaryHeap(AnyType[] items){
      currentSize = items.length;
      array = (AnyType[]) new Comparable[(currentSize+2)*11/10];

      int i = 1;
      for(AnyType item:items)
         array[i++] = item;
      buildHeap();
   }

   public void insert(AnyType x){
      //System.out.println("Insert item: "+x);
      if(currentSize == array.length - 1)
         enlargeArray(array.length*2 + 1);
      //优先堆为完全树,放在最后一个元素
      int hole = ++currentSize;
      //从最后一个元素开始上溯,直到寻找到合适的位置,存在hole中
      for(array[0] = x; x.compareTo(array[hole/2])<0; hole/=2)
         array[hole] = array[hole/2];
      //赋值
      array[hole] = x;
   }

   public AnyType findMin(){
      if(isEmpty())
         throw new UnderflowException();
      return array[1];
   }

   public AnyType deleteMin(){
      if(isEmpty())
         throw new UnderflowException();
      AnyType minItem = findMin();
      array[1] = array[currentSize--];
      percolateDown(1);
      return minItem;
   }

   public boolean isEmpty(){
      return 0 == currentSize;
   }

   public void makeEmpty(){
      currentSize = 0;
   }

   //DEBUG
   //public int getSize(){
   // return currentSize;
   //}

   //public AnyType getIndex(int i){
   // return array[i];
   //}

   private static final int DEFAULT_CAPACITY = 10;

   private int currentSize;
   private AnyType[] array;

   private void percolateDown(int hole){
      int child;
      AnyType tmp = array[hole];

      for(;hole*2 <= currentSize; hole = child){
         child = hole*2;
         //和两个儿子中较小的一个比较
         if(child != currentSize &&
               array[child+1].compareTo(array[child])<0)
            child++;
         //如果比儿子小,则把hole放入儿子中,同时在儿子位置继续
         if(array[child].compareTo(tmp)<0)
            array[hole] = array[child];
         else
            break;
      }
      array[hole] = tmp;
   }

   private void buildHeap(){
      for(int i = currentSize/2; i>0; i--)
         //从最后一个儿子开始倒着往前下溯
         percolateDown(i);
   }

   private void enlargeArray(int newSize){
      //System.out.println("Enlarge array size from "+array.length+" to "+newSize);
      AnyType[] old = array;
      array = (AnyType[]) new Comparable[newSize];
      for (int i = 0; i < old.length; i++) {
         array[i] = old[i];
      }
   }

   public static void main(String[] args) {
      int numItems = 10000;
      BinaryHeap<Integer> h = new BinaryHeap<Integer>( );
      int i = 1;

      for( i = 10000; i > 0; i-- )
         h.insert( i );

      //DEBUG
      //System.out.println(h.getSize());
      //for (int j = 0; j < h.getSize(); j++) {
      // System.out.println("array[" + j + "]: " + h.getIndex(j).toString());
      //}

      //ERROR CHECK
      for( i = 1; i < numItems; i++ )
         if( h.deleteMin( ) != i )
            System.out.println( "Oops! " + i );
   }
}
时间: 2024-10-14 18:36:36

基本数据结构之BinaryHeap的相关文章

深入浅出数据结构C语言版(19)——堆排序

在介绍优先队列的博文中,我们提到了数据结构二叉堆,并且说明了二叉堆的一个特殊用途--排序,同时给出了其时间复杂度O(N*logN).这个时间界是目前我们看到最好的(使用Sedgewick序列的希尔排序时间复杂度为O(N4/3),下图为两者函数图像对比,但是注意,这并不是希尔排序与堆排序的对比,只是两个大O阶函数的对比).这篇博文,我们就是要细化用二叉堆进行排序的想法,实现堆排序. 在介绍优先队列的博文中(http://www.cnblogs.com/mm93/p/7481782.html)所提到

POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O(1)找到最大/最小值,并能持续维护. 复杂度 push() = O(logn); pop() = O(logn); BinaryHeap() = O(nlogn); 实现 数组下标从1开始的情况下,有 Parent(i) = i >> 1 LChild(i) = i << 1 RChi

数据结构--堆的实现之深入分析

一,介绍 以前在学习堆时,写了两篇文章:数据结构--堆的实现(上)   和   数据结构--堆的实现(下),  感觉对堆的认识还是不够.本文主要分析数据结构 堆(讨论小顶堆)的基本操作的一些细节,比如 insert(插入)操作 和 deleteMin(删除堆顶元素)操作的实现细节.分析建堆的时间复杂度.堆的优缺点及二叉堆的不足. 二,堆的实现分析 堆的物理存储结构是一维数组,逻辑存储结构是完全二叉树.堆的基本操作有:insert--向堆中插入一个元素:deleteMin--删除堆顶元素 故堆的类

深入浅出数据结构C语言版(15)——优先队列(堆)

在普通队列中,元素出队的顺序是由元素入队时间决定的,也就是谁先入队,谁先出队.但是有时候我们希望有这样的一个队列:谁先入队不重要,重要的是谁的"优先级高",优先级越高越先出队.这样的数据结构我们称之为优先队列(priority queue),其常用于一些特殊应用,比如操作系统控制进程的调度程序. 那么,优先队列该如何实现呢?我们可以很快给出三种解决方案. 1.使用链表,插入操作选择直接插入到表头,时间复杂度为O(1),出队操作则遍历整个表,找到优先级最高者,返回并删除该结点,时间复杂度

JAVA数据结构--优先队列(堆实现)

优先队列(堆)的定义 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.堆即为解决此类问题设计的一种数据结构. 我个人比较通俗的理解就是比如我们平常下载视频看,我们打算下载两部视频,一部2G,一部只有200M.优先队列的思想就是先下载那部体积较小的视频,这样也比较合理,可以下完200M后

【数据结构】之散列链表(Java语言描述)

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<

旧题新做:从idy的视角看数据结构

“今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 second 给你一个长度为N 的整数序列,支持两种操作: • modity l r val 将区间[l,r] 中的所有数修改为val • query l r 询问区间[l,r] 所有数的和 分析:最简单的线段树,区间更改区间求和.但注意是更改,不是添改,sum与flag需同时覆盖. Problem 2.

数据结构Set和Map

一.数据结构 Set 集合的基本概念:集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中.  特点:key 和 value 相同,没有重复的 value.ES6 提供了数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. 1. 如何创建一个 Set const s = new Set([1, 2, 3]); 2.属性 console.log(s.size); // 3 3.Set 类的方法 --set.add(v

数据结构基本概念

什么是数据结构 "数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系.这些联系可以通过定义相关的函数来给出"--Sartaj Sahni,<数据结构.算法与应用> "数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现."--Clifford A.Shaffer,<数据结构与算法分析> "数据结构(data structture)是计算机中存储.组织数据的方式.通常情况下,经i想你