MyHeap:container/heap的数据载体,需要实现以下方法:
Len:堆中数据个数
Less:第i个元素 是否必 第j个元素 值小
Swap:交换第i个元素和 第j个元素
Push:向堆中追加元素
Pop:从堆中取出元素
下面是使用双向链路作为数据载体的最小堆实现方式:
package main
import (
"container/heap"
"fmt"
)
type HeapItem struct {
Value int
Prev *HeapItem
Next *HeapItem
}
type MyHeap struct {
Head *HeapItem
Tail *HeapItem
Length int
}
func (h *MyHeap) Len() int {
return h.Length
}
func (h *MyHeap) Less(i, j int) bool {
return h.Find(i).Value < h.Find(j).Value
}
func (h *MyHeap) Swap(i, j int) {
nodeI, nodeJ := h.Find(i), h.Find(j)
isNear := h.IsNear(nodeI, nodeJ)
// 记录I的前和后
nodeIPrev, nodeINext := nodeI.Prev, nodeI.Next
// 记录J的前和后
nodeJPrev, nodeJNext := nodeJ.Prev, nodeJ.Next
// 把J放到I的位置
nodeIPrev.Next = nodeJ
nodeJ.Prev = nodeIPrev
nodeJ.Next = nodeINext // near, 对于相邻元素, 这样操作有问题, 下面会重新赋值
nodeINext.Prev = nodeJ // near, 对于相邻元素, 这样操作有问题, 下面会重新赋值
// 把I放到J的位置
nodeJPrev.Next