golang heap小根堆源码走读
heap概览
在golang中,通过heap给出了一个实现小根堆的接口。
type Interface interface {
sort.Interface
Push(x interface{})
Pop() interface{}
}
由于小根堆中,需要根据容器中的元素大小来进行比较以确定元素在堆中的位置。因此也需要实现sort的接口。
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
因此,如果需要实现一个heap,需要实现Push(),Pop()(从堆顶弹出元素),Len(),Less()(进行元素之间比较的方法)以及Swap()方法。
heap已经实现的方法
heap的初始化
func Init(h Interface) {
n := h.Len()
for i := n/2 - 1; i >= 0; i-- {
down(h, i, n)
}
}
在heap的初始化方法中,值得注意的是,不同于java方法,在调用这个方法的时候,堆中的元素容器应该已经完成了数据的存放,这里的初始化不是初始化存储空间返回一个空的容器,而是对一个已经充满元素的容器进行堆排序。首先会获取堆的大小n,取决于堆的性质,将会从堆的n/2-1位置开始通过down()方法初始化,这个位置是堆中倒数第二层最后一个拥有子节点的节点,之后将会不断从当前层不断向左,遍历完当前层之后再从上一层的最右边开始。
func down(h Interface, i0, n int) bool {
i := i0 // i是方法中当前节点的下标
for {
j1 := 2*i + 1 // 获取当前节点的左

本文介绍了Golang中实现小根堆的具体方法,包括初始化、添加及弹出元素等核心操作,并详细解释了down()与up()方法的作用。
最低0.47元/天 解锁文章
900





