亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在自定義類型上構建堆

如何在自定義類型上構建堆

Go
慕沐林林 2022-09-05 16:46:31
我有一個KeyValue類型,看起來像這里:type KeyValue struct {    Key   string    Value string}由于我想在其上構建一個堆,因此我定義了一個ByKey類型并實現了該接口heap.Interfacetype ByKey []KeyValuefunc (a ByKey) Len() int           { return len(a) }func (a ByKey) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }func (a ByKey) Less(i, j int) bool { return a[i].Key < a[j].Key }func (a *ByKey) Push(x interface{}) {    *a = append(*a, x.(KeyValue))}func (a *ByKey) Pop() interface{} {    old := *a    n := len(old)    x := old[n-1]    *a = old[0 : n-1]    return x}但是當我運行測試時,容器/堆不起作用。我的測試代碼在這里:dic := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9"}generate := func(min, max int) *ByKey {    n := rand.Intn(max - min) + min    kvs := make(ByKey, 0)    for i := 0; i < n; i++ {        idx := rand.Intn(len(dic))        kvs = append(kvs, KeyValue{            Key:   dic[idx],            Value: "1",        })    }    return &kvs}    kv1 := generate(10, 15)fmt.Printf("before heapify kv1: %v\n", *kv1)heap.Init(kv1)fmt.Printf("after heapify kv1: %v\n", *kv1)輸出為:before heapify kv1: [{7 1} {3 1} {3 1} {5 1} {7 1} {8 1} {9 1} {5 1} {7 1} {6 1} {8 1}]after heapify kv1: [{3 1} {5 1} {3 1} {5 1} {6 1} {8 1} {9 1} {7 1} {7 1} {7 1} {8 1}]不幸的是,沒有按鍵排序。我認為像 、 或 這樣的函數中應該有問題。任何幫助是值得贊賞的。kv1Swap()Push()Pop()
查看完整描述

1 回答

?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

根據文檔:


堆是實現優先級隊列的常用方法。若要生成優先級隊列,請實現 Heap 接口,其中(負)優先級作為 Less 方法的順序,因此 Push 添加項目,而 Pop 從隊列中刪除優先級最高的項目。這些例子包括這樣的實現;文件example_pq_test.go具有完整的源代碼。


嘗試堆砌。彈出一個值:


for kv1.Len() > 0 {

    fmt.Printf("%d ", heap.Pop(kv1))

}

{3 1}

{3 1}

{5 1}

{5 1}

{6 1}

{7 1}

{7 1}

{7 1}

{8 1}

{8 1}

{9 1}


查看完整回答
反對 回復 2022-09-05
  • 1 回答
  • 0 關注
  • 77 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號