Binary Heap (二叉堆)
1. 二叉堆的定义
在计算机科学中,二叉堆是二叉树形状的堆结构。二叉堆是最常见的实现优先级队列的方法,它与优先级队列紧密相连,一起应用到诸多地方,在很多主流语言的标准算法库中都能看到它们的身影。同时它也是很多算法中需要用到的底层数据结构,能够快速地掌握这些已有的标准库和类,能够很高效地实现诸多算法。
- 其空间复杂度和相关操作的时间复杂度如下表所示:
Algorithm | Average | Worst Case |
---|---|---|
Space | O(n) | O(n) |
Search | O(n) | O(n) |
Insert | O(1) | O(log n) |
Delete | O(log n) | O(log n) |
Peek | O(1) | O(1) |
2. 二叉堆的性质
二叉堆的是一个具有堆性质的完全二叉树,因此二叉堆具备了完全二叉树和堆的全部特性,实现起来非常容易,也是程序员必须要掌握的基本数据结构。
最大堆示例
完全二叉树: 完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。只有最下面的两层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置。完全二叉树是一种效率很高的数据结构,通常采用数组形式存储,可以快速计算出一个节点的父子节点,同时不需要额外存储索引信息。
堆性质: 堆性质是指树中的任意节点的取值,均比其字节点的取值大,称为最大堆。(或小,称为最小堆)这个是基于二叉堆获得节点取值对应关系的重要依据,是体现优先级的地方。
3. C语言实现二叉堆的基本操作(指针操作)
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_LENGTH(x) (sizeof(x) / sizeof(x[0]))