Go的堆接口如何工作?

时间:2017-03-31 04:56:35

标签: go heap

在Go中,您可以实现堆:https://golang.org/src/container/heap/example_pq_test.go

您实施了sort.InterfacePopPush,并且您拥有了优先级队列/堆。在PopPush实现的示例中,未调用heap.Fix函数。我看到heap.Init被调用了,所以我可以理解一些堆发生的事情。但是,您可以推送和弹出运行您自己的代码的项目,并保持堆属性。

如果在init之后推送或弹出项目而不调用heap.fix,堆属性如何得到维护?

以下是该示例的操场:https://play.golang.org/p/wE413xwmxE

1 个答案:

答案 0 :(得分:2)

为了简化堆实现,您只需要为自定义类型提供排队逻辑。绑定由heap包本身完成。它是通过调用您的类型上定义的Push / Pop,然后调用堆化过程来实现的:

// from golang.org/src/container/heap/heap.go

// Push pushes the element x onto the heap. The complexity is
// O(log(n)) where n = h.Len().
//
func Push(h Interface, x interface{}) {
    h.Push(x)        // call to Push defined on your custom type
    up(h, h.Len()-1) // **heapification**
}

// 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) // **heapification**
    return h.Pop()
}