java语言程序设计(进阶篇)读书笔记 之 数据结构每天一小练--堆(一)
来源:互联网 发布:手机网页制作软件 编辑:程序博客网 时间:2024/06/08 02:29
堆是一种特殊的完全二叉树,它要求每个节点都大于或等于它的一个子节点
由于二叉树的性质可知
1,一个节点的父节点(i)的位置在:(i-1) / 2
2,一个节点的坐子节点(i)的位置为:2i + 1
3,一个节点的右子节点(i)的位置为:2i + 2
由于堆的特殊要求,所以我们插入一个新节点,和删除根节点(这俩种操作在堆中的执行效率很高),需要对堆进行重建。
可以借助数组,或列表实现堆的基本数据结构。
以ArrayList为例
1,插入一个新节点时,首先把新节点插入集合末尾,然后判断其和其父节点的大小,如果大于父节点,那么将它与它的父节点交换,交换列表中索引位置,依次循环,如果不再大于父节点,则堆已经重建完成。
2,删除根节点,删除后,先把列表的最后一个元素作为堆的跟节点,然后将它和它的子节点中大的节点做比较,交换列表中索引位置,依次循环,如果不再小于任何一个它的子节点。那么堆则构建完成。
package 堆;public class Heap<E extends Comparable> { private java.util.ArrayList<E> list = new java.util.ArrayList<E>();public Heap() { } public Heap(E[] objects) { for(int i = 0; i<objects.length; i++) { add(objects[i]); } } public void add(E newObject) { list.add(newObject); int currentIndex = list.size() - 1; while(currentIndex > 0) { int parentIndex = (currentIndex - 1)/2; if(list.get(currentIndex).compareTo(list.get(parentIndex)) > 0) { E temp = list.get(currentIndex); list.set(currentIndex, list.get(parentIndex)); list.set(parentIndex, temp); } else { break; } currentIndex = parentIndex; } } public E remove() { if(list.size() == 0) { return null; } E removedObject = list.get(0); list.set(0, list.get(list.size() - 1)); list.remove(list.get(list.size() - 1)); int currentIndex = 0; while(currentIndex < list.size()) { int leftChildIndex = 2 * currentIndex + 1; int rightChildIndex = 2*currentIndex + 2; if(leftChildIndex >=list.size()) break; int maxIndex = leftChildIndex; if(rightChildIndex < list.size()) { if(list.get(maxIndex).compareTo(list.get(rightChildIndex)) < 0) { maxIndex = rightChildIndex; } } if(list.get(currentIndex).compareTo(list.get(maxIndex)) < 0) { E temp = list.get(maxIndex); list.set(maxIndex, list.get(currentIndex)); list.set(currentIndex, temp); } else { break; } } return removedObject; } public int getSize() { return list.size(); }}
- java语言程序设计(进阶篇)读书笔记 之 数据结构每天一小练--堆(一)
- 《Java语言程序设计(基础篇)》读书笔记(一)
- JAVA语言程序设计 基础篇 读书笔记(前两章)
- 读书笔记 |《数据结构》 之什么是数据结构(一)
- 数据结构之堆(java)
- 《Java语言程序设计(基础篇)》读书笔记 完结篇
- 《Java语言程序设计(基础篇)》读书笔记(二)
- 《Java语言程序设计(基础篇)》读书笔记(三)
- 《Java语言程序设计(基础篇)》读书笔记(四)
- 《Java语言程序设计(基础篇)》读书笔记(五)
- 《java语言程序设计》笔记(一)
- Java语言程序设计基础(一)
- <<Java语言程序设计>>进阶篇 Exercise21_3
- <<Java语言程序设计>>进阶篇 Exercise22_3
- <<Java语言程序设计>>进阶篇 Exercise22_5
- <<Java语言程序设计>>进阶篇 Exercise22_7
- <<Java语言程序设计>>进阶篇 Exercise8_7
- windows程序员进阶系列:《软件调试》之堆 (一)
- Summary of OSI layers
- HTTP 1.1与HTTP 1.0的比较
- JDBC ODBC的区别
- JQuery节点的增删改差
- JQuery事件
- java语言程序设计(进阶篇)读书笔记 之 数据结构每天一小练--堆(一)
- http wrap
- Linux 的多线程编程的高效开发经验
- FreeNAS系统基本安装篇
- Windows Phone 7 开发常见问题汇集贴
- 窗体渐变效果 (C#winfrom)
- C中的预编译
- 对/etc/rc.d/init.d目录的一点理解
- 一致性hash算法 - consistent hashing