实现上一篇博客(http://blog.csdn.net/buleriver/article/details/38469977)说的D堆。假设把mD设置成2。D堆就退化成二叉堆,也就是说。二叉堆是D堆的一种情况。

public class DHeap {
public static final int INIT_CAPACITY = 10;
private int[] mArray;
private int mLength;
private final int mD; public DHeap(int d) {
mArray = new int[INIT_CAPACITY + 1];
mLength = 0;
mD = d;
} public int getParentIndex(int index) {
return (index - 2 + mD) / mD;
} public int getChildIndex(int pIndex, int childIndex) {
return mD * (pIndex - 1) + 2 + childIndex;
} private void expandArray(int length) {
int[] arr = new int[length];
System.arraycopy(mArray, 1, arr, 1, mLength);
mArray = arr;
} /**
* 自下而上,把value放到最后一个,然后一直和其父节点交换,找到合适的位置
*/
public void insert(int value) {
if (mLength >= mArray.length - 1) {
expandArray(mArray.length * 2);
}
mArray[++mLength] = value;
int index = mLength;
int parentIndex = getParentIndex(index);
while (parentIndex > 0) {
int currentValue = mArray[index];
int parentValue = mArray[parentIndex];
if (currentValue < parentValue) {
mArray[parentIndex] = currentValue;
mArray[index] = parentValue;
index = parentIndex;
parentIndex = getParentIndex(index);
} else {
break;
}
}
} public void deleteMin() {
if (mLength <= 0) {
return;
} else if (mLength == 1) {
mLength--;
} else {
mArray[1] = mArray[mLength];
int index = 1;
mLength--;
while (true) {
int value = mArray[index];
int minIndex = -1; // 最小孩子的数组索引
boolean lastLevel = false; // 是否已经到了最底层
int firstChildIndex = getChildIndex(index, 0);
int lastChildIndex = firstChildIndex + mD;
for (int childIndex = firstChildIndex; childIndex < lastChildIndex; childIndex++) { // 找到最小的孩子
if (childIndex > mLength) { // 已经到了最后一个
lastLevel = true;
break;
}
int childValue = mArray[childIndex];
if (value > childValue) {
value = childValue;
minIndex = childIndex;
}
}
if (minIndex < 0) { // 已经符合d堆的性质,不须要置换了
break;
} else { // 须要置换
mArray[minIndex] = mArray[index];
mArray[index] = value;
index = minIndex;
}
if (lastLevel) { // 已经到了最底层
break;
}
}
}
}
}

D堆的实现的更多相关文章

  1. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  2. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

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

    在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...

  4. 计算机程序的思维逻辑 (47) - 堆和PriorityQueue的应用

    45节介绍了堆的概念和算法,上节介绍了Java中堆的实现类PriorityQueue,PriorityQueue除了用作优先级队列,还可以用来解决一些别的问题,45节提到了如下两个应用: 求前K个最大 ...

  5. JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面 ...

  6. 数据结构:优先队列 基于堆实现(python版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu ''' #异常类 class HeapPriQueueError( ...

  7. 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序

    #!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...

  8. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

  9. AC日记——二叉堆练习3 codevs 3110

    3110 二叉堆练习3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给定N(N≤500,000)和N个整 ...

  10. codevs 2879 堆的判断

    codevs 2879 堆的判断 http://codevs.cn/problem/2879/ 题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父亲节点比两个儿 ...

随机推荐

  1. Tyk-Hybrid模式安装—抽象方法论,重用它

    最近,公司有计划运用API网关.那么,在经过权衡之后,使用了Tyk的Hybrid模式!现在环境没问题了,API调用也测通了.我得想想合并服务,监控API实时情况的东西.但在这个环境搭建的过程中,我目前 ...

  2. Can not issue data manipulation statements with executeQuery().解决方案

    这个错误提示是说无法发行sql语句到指定的位置 错误写法: 正确写法: excuteQuery是查询语句,而我要调用的是更新的语句,所以这样数据库很为难到底要干嘛,实际我想用的是更新,但是我写成了查询 ...

  3. 在Python中建立N维数组并赋初值

    在Python中,由于不像C++/Java这样的语言可以方便的用a[i][j]=0的方式,建立二维数组并赋初值,所以需要一个相对巧妙的方法. 可以用列表解析的方式,eg: >>> m ...

  4. C++之Effective STL学习笔记Item20

    Q:假设我们现在需要一个string*的set,我们向其插入一些动物到这个set中: set<string*> ssp; // ssp = “set of string ptrs” ssp ...

  5. canvas 转化为 img

    ]; var image = new Image(); image.src = c.toDataURL("image/png"); $("#qrcode canvas&q ...

  6. Mondriaan's Dream(poj 2411)

    题意:在n*m的方格里铺1*2的骨牌,有多少种方案 /* 第一次做插头DP,感觉和状压差不多. 这道题是利用上一行的状态来更新下一行的状态. 1代表上一行这个位置填了一个竖的(即本行可以填): 0代表 ...

  7. Redis Cluster 集群的实现和管理

    系统环境 CentOS 7 集群规划 在一台物理机(实际部署应当分散到多个物理机上),创建6个Redis节点,其中3个主节点.3个从节点. 节点表: IP 端口 主从 路径 192.168.1.21 ...

  8. 【CF675E】Trains and Statistic(贪心,DP,线段树优化)

    题意:a[i]表示从第i个车站可以一张票到第[i+1,a[i]]这些车站;p[i][j]表示从第i个车站到第j个车站的最少的票数,现在要求∑dp[i][j](1<=i<=n,i<j& ...

  9. sharpwebmail邮件管理系统开源 下载及使用方法

    原文发布时间为:2008-11-16 -- 来源于本人的百度文章 [由搬家工具导入] 网址:http://sourceforge.net/projects/sharpwebmail/ 点击后:点击do ...

  10. JS函数(自调函数)与闭包【高级函数】

    JavaScript:BOM(浏览器对象)+DOM(文档对象)+ECMAScript javascript面向对象: * 概述: * 发展: * 互联网发展对浏览器页面性能或效果要求越来越高,HTML ...