• 优先队列 过期时间 小顶堆


    优先队列 过期时间 小顶堆

     src\container\heap\example_pq_test.go

    PriorityQueue
    // Copyright 2012 The Go Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.

    // This example demonstrates a priority queue built using the heap interface.
    package heap_test

    import (
        "container/heap"
        "fmt"
    )

    // An Item is something we manage in a priority queue.
    type Item struct {
        value    string // The value of the item; arbitrary.
        priority int    // The priority of the item in the queue.
        // The index is needed by update and is maintained by the heap.Interface methods.
        index int // The index of the item in the heap.
    }

    // A PriorityQueue implements heap.Interface and holds Items.
    type PriorityQueue []*Item

    func (pq PriorityQueue) Len() int { return len(pq) }

    func (pq PriorityQueue) Less(i, j int) bool {
        // We want Pop to give us the highest, not lowest, priority so we use greater than here.
        return pq[i].priority > pq[j].priority
    }

    func (pq PriorityQueue) Swap(i, j int) {
        pq[i], pq[j] = pq[j], pq[i]
        pq[i].index = i
        pq[j].index = j
    }

    func (pq *PriorityQueue) Push(x any) {
        n := len(*pq)
        item := x.(*Item)
        item.index = n
        *pq = append(*pq, item)
    }

    func (pq *PriorityQueue) Pop() any {
        old := *pq
        n := len(old)
        item := old[n-1]
        old[n-1] = nil  // avoid memory leak
        item.index = -1 // for safety
        *pq = old[0 : n-1]
        return item
    }

    // update modifies the priority and value of an Item in the queue.
    func (pq *PriorityQueue) update(item *Item, value string, priority int) {
        item.value = value
        item.priority = priority
        heap.Fix(pq, item.index)
    }

    // This example creates a PriorityQueue with some items, adds and manipulates an item,
    // and then removes the items in priority order.
    func Example_priorityQueue() {
        // Some items and their priorities.
        items := map[string]int{
            "banana": 3, "apple": 2, "pear": 4,
        }

        // Create a priority queue, put the items in it, and
        // establish the priority queue (heap) invariants.
        pq := make(PriorityQueue, len(items))
        i := 0
        for value, priority := range items {
            pq[i] = &Item{
                value:    value,
                priority: priority,
                index:    i,
            }
            i++
        }
        heap.Init(&pq)

        // Insert a new item and then modify its priority.
        item := &Item{
            value:    "orange",
            priority: 1,
        }
        heap.Push(&pq, item)
        pq.update(item, item.value, 5)

        // Take the items out; they arrive in decreasing priority order.
        for pq.Len() > 0 {
            item := heap.Pop(&pq).(*Item)
            fmt.Printf("%.2d:%s ", item.priority, item.value)
        }
        // Output:
        // 05:orange 04:pear 03:banana 02:apple
    }
     
     
     
  • 相关阅读:
    sizeof与strlen的区别
    面试题46:求1+2+...+n
    opennebula 安装指定参数
    opennebula 开发记录
    virsh 查看hypervisor特性
    opennebula kvm日志
    Cgroup
    opennebula kvm 创建VM oned报错日志
    opennebula kvm 创建虚拟机错误
    golang hello
  • 原文地址:https://www.cnblogs.com/rsapaper/p/16700681.html
Copyright © 2020-2023  润新知