【Go - 小頂堆/大頂堆】

在 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]
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容