12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package dispatch
- import (
- "container/heap"
- "errors"
- )
- type HeapData []*HeapDataItem
- type HeapDataItem struct {
- value interface{}
- weight float64
- }
- func (d HeapData) Len() int {
- return len(d)
- }
- func (d HeapData) Swap(i, j int) {
- d[i], d[j] = d[j], d[i]
- }
- func (d *HeapData) Push(x interface{}) {
- item := x.(*HeapDataItem)
- *d = append(*d, item)
- }
- func (d *HeapData) Pop() interface{} {
- old := *d
- n := len(old)
- item := old[n-1]
- *d = old[0 : n-1]
- return item
- }
- type MinHeapData struct {
- HeapData
- }
- func (d MinHeapData) Less(i, j int) bool {
- return d.HeapData[i].weight < d.HeapData[j].weight
- }
- type MinHeap struct {
- data MinHeapData
- }
- func NewMinHeap() *MinHeap {
- h := new(MinHeap)
- heap.Init(&h.data)
- return h
- }
- func (h *MinHeap) HeapPush(value interface{}, weight float64) {
- heap.Push(&h.data, &HeapDataItem{
- value: value,
- weight: weight,
- })
- }
- func (h *MinHeap) HeapPop() (interface{}, float64, error) {
- if h.data.Len() == 0 {
- return nil, 0, errors.New("heap is empty")
- }
- item := heap.Pop(&h.data).(*HeapDataItem)
- return item.value, item.weight, nil
- }
- func (h *MinHeap) HeapTop() (interface{}, float64, error) {
- if h.data.Len() == 0 {
- return nil, 0, errors.New("heap is empty")
- }
- item := h.data.HeapData[0]
- return item.value, item.weight, nil
- }
- func (h *MinHeap) HeapLength() int {
- return h.data.Len()
- }
|