我使用container/heap
包来实现优先级队列。但有一件事困扰着我。如果堆为空,interface.Pop()
方法的行为应该是什么?我没有看到文档中提到的任何内容,源代码似乎没有预料到这种情况:
// Pop removes the minimum element (according to Less) from the heap
// and returns it. The complexity is O(log(n)) where n = h.Len().
// It is equivalent to Remove(h, 0).
//
func Pop(h Interface) interface{} {
n := h.Len() - 1
h.Swap(0, n)
down(h, 0, n)
return h.Pop()
}
显然,如果h.Len()
为0
,则效果不佳。这仅仅意味着panic
还是用户希望始终检查是否还有任何项目?
答案 0 :(得分:1)
自然行为是恐慌。这就是IntHeap example的作用。
正如评论中所指出的,如果h.Pop()
恐慌,控制权将无法达到h.Swap()
。但是,如果h.Pop()
被赋予-1作为索引,则仍可以在空堆上调用heap.Remove()
:
// Remove removes the element at index i from the heap.
// The complexity is O(log(n)) where n = h.Len().
//
func Remove(h Interface, i int) interface{} {
n := h.Len() - 1
if n != i {
h.Swap(i, n)
down(h, i, n)
up(h, i)
}
return h.Pop()
}
如果h.Swap()
对负面指数感到恐慌,h.Pop()
也应该对一致性感到恐慌。
让h.Swap()
默默地忽略否定索引而h.Pop()
返回默认值nil
是一致的,但其他程序员会发现这令人惊讶,所以我不推荐它。< / p>