package heap

import “container/heap”

heap包提供了对任意类型(实现了heap.Interface接口)的堆操作。(最小)堆是具有“每个节点都是以其为根的子树中最小值”属性的树。

树的最小元素为其根元素,索引0的位置。

heap是常用的实现优先队列的方法。要创建一个优先队列,实现一个具有使用(负的)优先级作为比较的依据的Less方法的Heap接口,如此一来可用Push添加项目而用Pop取出队列最高优先级的项目。

Example (IntHeap) Example (PriorityQueue) Index 返回首页

type Interface func Init(h Interface) func Push(h Interface, x interface{}) func Pop(h Interface) interface{} func Remove(h Interface, i int) interface{} func Fix(h Interface, i int) Examples

返回首页

package (IntHeap) package (PriorityQueue) type Interface type Interface interface { sort.Interface Push(x interface{}) // 向末尾添加元素 Pop() interface{} // 从末尾删除元素 } 任何实现了本接口的类型都可以用于构建最小堆。最小堆可以通过heap.Init建立,数据是递增顺序或者空的话也是最小堆。最小堆的约束条件是:

!h.Less(j, i) for 0 <= i < h.Len() and 2i+1 <= j <= 2i+2 and j < h.Len() 注意接口的Push和Pop方法是供heap包调用的,请使用heap.Push和heap.Pop来向一个堆添加或者删除元素。

func Init func Init(h Interface) 一个堆在使用任何堆操作之前应先初始化。Init函数对于堆的约束性是幂等的(多次执行无意义),并可能在任何时候堆的约束性被破坏时被调用。本函数复杂度为O(n),其中n等于h.Len()。

func Push func Push(h Interface, x interface{}) 向堆h中插入元素x,并保持堆的约束性。复杂度O(log(n)),其中n等于h.Len()。

func Pop func Pop(h Interface) interface{} 删除并返回堆h中的最小元素(不影响约束性)。复杂度O(log(n)),其中n等于h.Len()。等价于Remove(h, 0)。

func Remove func Remove(h Interface, i int) interface{} 删除堆中的第i个元素,并保持堆的约束性。复杂度O(log(n)),其中n等于h.Len()。

func Fix func Fix(h Interface, i int) 在修改第i个元素后,调用本函数修复堆,比删除第i个元素后插入新元素更有效率。

复杂度O(log(n)),其中n等于h.Len()。