二叉堆(优先队列)
2015-10-29 22:34
330 查看
【0】README
0.1) 本文总结于 数据结构与算法分析,但源代码均为原创;旨在理清二叉堆(优先队列) + 堆的其他操作及其应用, 以便让朋友些知道为什么要学习优先队列;【1】二叉堆
1.0)优先队列定义:优先队列是允许至少下列两种操作的数据结构,insert(插入), 它的工作时显而易见的,以及 deleteMin(删除最小者), 它的工作是找出、返回和删除优先队列中最小的元素;1.1)我们把二叉堆中只叫做堆, 堆也有两个性质:结构性和堆序性;对堆的 insert and deleteMin 操作必须要到堆的所有性质都被满足时才能终止;
1.2)结构性质
堆是一棵被完全填满的二叉树,其底层上的元素从左到右填入,这样的树称为 完全二叉树;完全二叉树 的高是 logN(向下取整), 显然它是 O(logN);
堆数据结构将由一个数组(不管关键字是什么类型)、一个代表最大值的整数及当前的堆大小组成;
1.3) 堆序性质
1)堆序性:使操作被快速执行的性质是 堆序性;由于我们想要快速找出最小元,因此最小元应该在根上;依据树的递归定义,则任意节点就应该小于它的后裔;
【2】基本的堆操作
2.1)insert 插入:为将一个元素X 插入到堆中, 在下一个空闲位置创建一个空穴, 否则该堆将不是完全树;如果X 可以放在该空穴中而并不破坏堆的序, 那么插入完成, 否则, 我们把空穴的父节点上的元素移入该空穴中;(这种一般策略叫做 上滤, 新元素在堆中上滤直到找出正确的位置);2.2)deleteMin(删除最小元):找出最小元容易,困难是删除它;当删除一个最小元时, 在根节点处产生了一个空穴, 由于现在堆少了一个元素,因此对中最后一个元素 X 必须移动到堆的某个地方;如果X 可以被放到空穴中,那么 deleteMin 完成;显然这一般不可能, 因此我们将空穴中的较小者移入空穴, 这样就把空穴向下推了一层;重复该步骤直到 X 可以被放入空穴中;因此,我们的做法是将 X 置入沿着从根开始包含最小儿子的 一条路径上的一个正确的位置;(这种策略叫做下滤);
2.3)出现的问题+解决方法
出现的问题:在堆实现中, 经常发生的错误是当堆中存在偶数个元素的时候, 此时将遇到一个节点只有一个儿子的情况, 我们必须保证假设节点不总有两个儿子;
解决方法:始终保证你的算法把每一个节点都看成有两个儿子;
【3】源代码+printing
3.1)download source code :https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter6
3.2)代码详情+打印效果参见
http://blog.csdn.net/PacosonSWJTU/article/details/49498255
的“【2】source code+printing”部分,因为二叉堆(优先队列)的基本操作 和 其他高级的应用操作的实现代码我都放到一起的;
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java数据结构和算法学习之汉诺塔示例
- Java数据结构及算法实例:三角数字
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构之AVL树详解
- qqwry.dat的数据结构图文解释第1/2页
- JavaScript中数据结构与算法(五):经典KMP算法