空堆上的容器/堆Pop()

时间:2016-11-10 20:02:53

标签: go containers heap

我使用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还是用户希望始终检查是否还有任何项目?

1 个答案:

答案 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>