Go 优先队列的实现

Go 优先队列的实现

优先队列的构造主要使用”container/heap”包下的heap来实现

看先heap.Interface的定义

type Interface interface {
    sort.Interface
    Push(x interface{}) // add x as element Len()
    Pop() interface{}   // remove and return element Len() - 1.
}

首先要实现 sort.Interface 接口的三个方法

type Interface interface {
        // 获取数据集合元素个数
        Len() int
        // 如果 i 索引的数据小于 j 索引的数据,返回 true,且不会调用下面的 Swap(),即数据升序排序。
        Less(i, j int) bool
        // 交换 i 和 j 索引的两个元素的位置
        Swap(i, j int)
}

接着实现heap.Interface中的Pop和Push两个方法:

func Push(h Interface, x interface{}) {
}
func Pop(h Interface) interface{} {
}

调用heap的push和pop方法即可:

//heap文件中已定义的方法
func Push(h Interface, x interface{}) {
    h.Push(x)
    up(h, h.Len()-1)
}
//
func up(h Interface, j int) {
    for {
        i := (j - 1) / 2 // parent
        if i == j || !h.Less(j, i) {
            break
        }
        h.Swap(i, j)
        j = i
    }
}
//可以看到,需要使用到我们定义的一些less函数

举例:

//sort.IntSlice已经实现了 sort.Interface的三个方法
type hp struct {
    sort.IntSlice
}

//优先队列需要实现 Push和Pop两个方法
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
func (h *hp) Pop() interface{} {
    a := h.IntSlice
    v := a[len(a)-1]
    h.IntSlice = a[:len(a)-1]
    return v
}
//
func main(){
  h := hp{}
    heap.Push(&h, 2)
    heap.Push(&h, 1)
    fmt.Println(h)
  //打印出来是已经排序好的
}

   转载规则


《Go 优先队列的实现》 朱林刚 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
菊花细粒度识别模型可视化软件 菊花细粒度识别模型可视化软件
菊花细粒度识别模型可视化软件Requirements Python==3.7 torch==1.7.0 Pyqt5 软件使用 图片初始打开路径修改 由于系统原因,需要修改系统路径,在main.py中修改 运行main.py 选
2021-05-13
下一篇 
Es学习 Es学习
ES查询filter DSL和query DSL filter DSL 在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?” 答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。 过滤上
2020-11-12
  目录