堆積
堆()是计算机科学中的一種特別的完全二叉树。若是滿足以下特性,即可稱為堆積:「給定堆積中任意節點P和C,若P是C的母節點,那麼P的值會小於等於(或大於等於)C的值」。若母節點的值恆小於等於子節點的值,此堆積稱為最小堆積();反之,若母節點的值恆大於等於子節點的值,此堆積稱為最大堆積()。在堆積中最頂端的那一個節點,稱作根節點(),根節點本身沒有母節點()。
「堆積」的各地常用名稱 | |
---|---|
中国大陸 | |
臺灣 |
堆積始於J. W. J. Williams在1964年發表的堆積排序(),當時他提出了二元堆積樹作為此演算法的資料結構。
性质
堆的实现通过构造二叉堆(binary heap),实为二叉树的一种;由于其应用的普遍性,当不加限定时,均指该数据结构的这种实现。这种数据结构具有以下性质。
- 任意节点小于(或大于)它的所有后裔,最小元(或最大元)在堆的根上(堆序性)。
- 堆总是一棵完全树。即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
支持的基本操作
操作 | 描述 | 时间复杂度 |
---|---|---|
build | 採用羅伯特·弗洛伊德提出的較快方式建立堆 | |
insert | 向堆中插入一个新元素 | |
update | 将新元素提升使其符合堆的性质 | |
get | 获取当前堆顶元素的值 | |
delete | 删除堆顶元素 | |
heapify | 使删除堆顶元素的堆再次成为堆 |
某些堆实现还支持其他的一些操作,如斐波那契堆支持检查一个堆中是否存在某个元素。
示例代码
为将元素X插入堆中,找到空闲位置,建立一个空穴,若满足堆序性(英文:heap order),则插入完成;否则将父节点元素装入空穴,删除该父节点元素,完成空穴上移。直至满足堆序性。这种策略叫做上滤(percolate up)。[1]
以上是插入到一个二叉堆的过程。
DeleteMin
,删除最小元,即二叉树的根或父节点。删除该节点元素后,队列最后一个元素必须移动到堆得某个位置,使得堆仍然满足堆序性质。这种向下替换元素的过程叫作下滤。
应用
堆排序
堆(通常是二叉堆)常用于排序。这种算法称作堆排序。
事件模拟
主要运用堆的排序以选择优先。
参考
- 《数据结构与算法分析》Mark Allen Weiss(美)第六章,优先队列(堆)。
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.