曹耘豪的博客

Go数据结构:heap

  1. 使用
    1. 引入
    2. heap主要方法
    3. 使用
      1. 一个Int最小堆
  2. 参考

使用

引入

1
2
3
import (
"container/heap"
)

heap主要方法

第一个参数都是实现了heap.Interface的对象

1
2
3
4
5
func Fix(h Interface, i int)
func Init(h Interface)
func Pop(h Interface) any
func Push(h Interface, x any)
func Remove(h Interface, i int) any

使用

如果一个类型实现了heap.Interface接口,便可以使用heap提供的方法,heap.Interface类型如下

1
2
3
4
5
type Interface interface {
sort.Interface
Push(x any) // add x as element Len(),注意这里不是heap的Push
Pop() any // remove and return element Len() - 1.,注意这里不是heap的Pop
}

其中sort.Interface为排序接口,具体如下

1
2
3
4
5
6
7
8
9
10
11
type Interface interface {
// Len is the number of elements in the collection.
Len() int

// Less reports whether the element with index i
// must sort before the element with index j.
Less(i, j int) bool

// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}

一个Int最小堆

通过[]int实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type IntHeap []int

func (h IntHeap) Len() int { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] } // 这里改成大于就是最大堆
func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }

func (h *IntHeap) Push(x any) {
// Push and Pop use pointer receivers because they modify the slice's length,
// not just its contents.
*h = append(*h, x.(int))
}

func (h *IntHeap) Pop() any {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}

验证

1
2
3
4
5
6
7
8
9
func main() {
h := &IntHeap{2, 1, 5}
heap.Init(h)
heap.Push(h, 3)
fmt.Printf("minimum: %d\n", (*h)[0])
for h.Len() > 0 {
fmt.Printf("%d ", heap.Pop(h))
}
}

输出:

1
2
minimum: 1
1 2 3 5

参考

   /