golang中container/heap包源码分析

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包源码分析的主要内容,如果未能解决你的问题,请参考以下文章