一:什么是二叉堆
二:二叉堆的实现
三:使用二叉堆的几个例子
一:什么是二叉堆
1.1:二叉堆简介
二叉堆故名思议是一种特殊的堆,二叉堆具有堆的性质(
父节点的
键值
总是大于或等于(小于或等于)任何一个子节点的键值),二叉堆又具有二叉树的性质(
二叉堆是
完全二叉树
或者是
近似完全二叉树)。当父节点的键值大于或等于(小于或等于)它的每一个子节点的键值时我们称它为最大堆(最小堆)。
二叉堆多数是以数组作为它们底层元素的存储,根节点在数组中的索引是1,存储在第n个位置的父节点它的子节点在数组中的存储位置为2n与2n+1。可以借用网上的一幅图来标示这种存储结构。其中数字表明节点在数组中的存储位置。
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ / \
8 9 10 11
1.2:二叉堆支持的操作
二叉堆通常支持以下操作:删除,插入节点,创建二叉堆。这些操作复杂对都是O(log2n)
二叉堆也可以支持这些操作:查找。O(n)复杂度。
1.3:二叉堆的特点
二叉堆是专门为取出最大或最小节点而设计点数据结构,这种数据结构在查找一般元素方面性能和一般数组是没有多大区别的。二叉堆在取出最大或最最小值的性能表现是O(1),取出操作完成之后,二叉堆需要一次整形操作,以便得到下一个最值,这个操作复杂度O(log2n)。这是一个相当理想的操作时间。但是二叉堆也有一个缺点,就是二叉堆对存储在内存中的数据操作太过分散,这导致了二叉堆在cpu高速缓存的利用与内存击中率上面表现不是很好,这也是一个二叉堆理想操作时间所需要付出的代价。
1.4:二叉堆的使用范围
二叉堆主要的应用击中在两个地方一个是排序,一个是基于优先级队列的算法。比如:
1:A*寻路
2:统计数据(维护一个M个最小/最大的数据)
3:huffman code(数据压缩