Posted Davygeek
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang中container/heap包源码分析相关的知识,希望对你有一定的参考价值。
学习golang难免需要分析源码包中一些实现,下面就来说说container/heap包的源码
heap的实现使用到了小根堆,下面先对堆做个简单说明
1. 堆概念
2. heap
树的最小元素在根部,为index 0.
heap包对任意实现了heap接口的类型提供堆操作。
heap是常用的实现优先队列的方法。要创建一个优先队列,实现一个具有使用(负的)优先级作为比较的依据的Less方法的Heap接口,如此一来可用Push添加项目而用Pop取出队列最高优先级的项目。
根据上面interface的定义,可以看出这个堆结构继承自sort.Interface, 而sort.Interface,需要实现三个方法:Len(), Less() , Swap() 。
同事还需要实现堆接口定义的两个方法:Push(x interface{}) / Pop() interface{}, 所以我们要想使用heap定义一个堆, 只需要定义实现了这五个方法结构就可以了。
任何实现了本接口的类型都可以用于构建最小堆。最小堆可以通过heap.Init建立,数据是递增顺序或者空的话也是最小堆。最小堆的约束条件是:
注意接口的Push和Pop方法是供heap包调用的,请使用heap.Push和heap.Pop来向一个堆添加或者删除元素。
以下是heap导出的方法:
实例:
1. 包含int的最小堆
2. 用heap创建一个优先级队列
说明:测试源码都是golang包里面提供的, 有兴趣可以直接去查阅下golang源码
以上是关于golang中container/heap包源码分析的主要内容,如果未能解决你的问题,请参考以下文章