我的优先级队列的Pop方法有什么问题?

基于Rob Pike的负载均衡器演示,我实现了自己的优先级队列,但是我的Pop方法不正确,任何人都可以告诉我哪里出了问题吗?


package main


import (

    "fmt"

    "container/heap"

)


type ClassRecord struct {

    name  string

    grade int

}


type RecordHeap []*ClassRecord


func (p RecordHeap) Len() int { return len(p) }


func (p RecordHeap) Less(i, j int) bool {

    return p[i].grade < p[j].grade

}


func (p *RecordHeap) Swap(i, j int) {

    a := *p

    a[i], a[j] = a[j], a[i]

}


func (p *RecordHeap) Push(x interface{}) {

    a := *p

    n := len(a)

    a = a[0 : n+1]

    r := x.(*ClassRecord)

    a[n] = r

    *p = a

}


func (p *RecordHeap) Pop() interface{} {

    a := *p

    *p = a[0 : len(a)-1]

    r := a[len(a)-1]

    return r

}


func main() {

    a := make([]ClassRecord, 6)

    a[0] = ClassRecord{"John", 80}

    a[1] = ClassRecord{"Dan", 85}

    a[2] = ClassRecord{"Aron", 90}

    a[3] = ClassRecord{"Mark", 65}

    a[4] = ClassRecord{"Rob", 99}

    a[5] = ClassRecord{"Brian", 78}

    h := make(RecordHeap, 0, 100)

    for _, c := range a {

        fmt.Println(c)

        heap.Push(&h, &c)

        fmt.Println("Push: heap has", h.Len(), "items")

    }

    for i, x := 0, heap.Pop(&h).(*ClassRecord); i < 10 && x != nil; i++ {

        fmt.Println("Pop: heap has", h.Len(), "items")

        fmt.Println(*x)

    }

}

编辑:除了cthom06指出的方式,另一种解决此问题的方法是创建一个指针数组,如下所示,


a := make([]*ClassRecord, 6)

a[0] = &ClassRecord{"John", 80}

a[1] = &ClassRecord{"Dan", 85}

......


一只名叫tom的猫
浏览 230回答 1
1回答

慕仙森

编辑:哦,我应该马上看到这个。heap.Push(&h, &c)您推入c的地址,该地址将在范围的每次迭代中重用。堆中的每个记录都是一个指向内存中同一区域的指针,最终成为Brian。我不确定这是预期的行为还是编译器错误,但是t := cheap.Push(&h, &t)解决它。另外:您的for循环是错误的。for h.Len() > 0 {&nbsp; &nbsp; x := heap.Pop(&h...应该修复它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go