在 Go 中查看优先级队列的顶部?

Posted

技术标签:

【中文标题】在 Go 中查看优先级队列的顶部?【英文标题】:Peeking into the top of the Priority Queue in Go? 【发布时间】:2020-08-09 16:39:20 【问题描述】:

我试图使用heap 实现一个示例程序,并且我能够从堆中实现PushPop。我能够实现 Push 和 Pop 方法并按如下方式使用它们:

import "container/heap"

type Meeting struct 
    start int
    end int


func NewMeeting(times []int) *Meeting 
    return &Meetingstart: times[0], end: times[1] 


type PQ []*Meeting

func (pq PQ) Len() int 
    return len(pq)


func (pq PQ) Less(i, j int) bool 
    return pq[i].end < pq[j].end


func (pq PQ) Swap(i, j int) 
    pq[i], pq[j]  = pq[j], pq[i]



func (pq *PQ) Push(x interface) 
    item := x.(*Meeting)
    *pq = append(*pq, item)


func (pq *PQ) Pop() interface 
    old := *pq
    n := len(old)
    item := old[n-1]
    old[n-1] = nil  // avoid memory leak
    *pq = old[0 : n-1]
    return item


func minMeetingRooms(intervals [][]int) int 
    pq := make(PQ, 0)
    heap.Init(&pq)
    heap.Push(&pq, NewMeeting([]int1, 3))
    heap.Push(&pq, NewMeeting([]int1, 2))
    fmt.Println(heap.Pop(&pq).(*Meeting)) // I would like to log this without popping prom the Queue
    return 0

请看minMeetingRooms函数中代码sn-p中的注释。

我想记录优先队列的顶部,而不是实际弹出它。我该怎么做?

【问题讨论】:

只获取内部数组的最后一个元素(定义一个 Peek() 函数) @frozen 根据github code heap.Pop 在返回 Pop 元素之前进行交换和渗透。最后一个元素是否总是包含 heap.Pop 将返回的项目? @frozen 我尝试返回最后一个元素,但它没有给我相同的元素 github.com/golang/go/issues/17510 最小值在索引0处,所以实际上第一个元素就足够了 【参考方案1】:

您可以通过返回底层数组的第一个元素来“窥视”pop() 将返回的元素。

【讨论】:

【参考方案2】:
fmt.Println(pq[0])

你需要使用第一个元素来查看

【讨论】:

以上是关于在 Go 中查看优先级队列的顶部?的主要内容,如果未能解决你的问题,请参考以下文章

在排序优先级队列整数时遇到问题[关闭]

队列 先进先出,先进后出,优先级队列

原来实现优先级队列如此简单

java 使用优先级队列管理元素中值的数据结构的Java实现(在O(1)中查看,在O(logN)中插入/删除)

[ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解

倒序优先队列[重复]