您的位置:首页 > 理论基础 > 数据结构算法

二叉堆(优先队列)

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”部分,因为二叉堆(优先队列)的基本操作 和 其他高级的应用操作的实现代码我都放到一起的;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息