在 Go 語言中,標準庫 container/heap 提供了堆(Heap)的實現(xiàn)??梢允褂?container/heap 包來實現(xiàn)自己的大頂堆或小頂堆。
小頂堆示例
以下是一個使用 container/heap 包實現(xiàn)的小頂堆示例:
package main
import (
"container/heap"
"fmt"
)
type IntHeap []int
func (h IntHeap) Len() int {
return len(h)
}
func (h IntHeap) Less(i int, j int) bool {
return h[i] < h[j]
}
func (h IntHeap) Swap(i int, j int) {
h[i], h[j] = h[j], h[i]
}
func (h *IntHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0:n-1]
return x
}
func (h *IntHeap) Push(x interface{}) {
*h = append(*h, x.(int))
}
func main() {
h := &IntHeap{2, 1, 5}
heap.Init(h)
heap.Push(h, 3)
m := (*h)[0]
fmt.Printf("minimum: %d\n", m)
m = heap.Pop(h).(int)
fmt.Printf("minimum %d\n", m)
m = heap.Pop(h).(int)
fmt.Printf("minimum %d\n", m)
}
注意?? :
- 涉及到空間變化的,Push,Pop 傳參是指針類型,其余的是引用類型。
- Push,Pop的參數(shù)為interface{},在內(nèi)部再進行類型轉(zhuǎn)換
大頂堆,則只需將Less函數(shù)改下,小于改為大于,其余代碼一致。
func (h IntHeap) Less(i int, j int) bool {
return h[i] > h[j]
}