GO 实现优先队列

在php中提供了SplPriorityQueue来实现优先队列操作。在Go中,虽然没有直接提供优先队列的实现,不过通过标准库container/heap可以很方便的实现一个简单的优先队列。

heap 提供了堆的数据结构,通过实现heap.Interface接口,可以快速实现最大堆或者最小堆。而优先队列通常是在最大堆上做封装即可。在go官网heap包的文档中,提供了一个简单的优先队列演示,以下基于go官方文档中的代码做重新调整实现优先队,用go实现了php优先队列代码中的演示。

package main

import (
    "container/heap"
    "fmt"
)

type Item struct {
    value    string // The value of the item; arbitrary.
    priority int    // The priority of the item in the queue.
}

type PriorityQueue []*Item

func (pq PriorityQueue) Len() int { return len(pq) }
func (pq PriorityQueue) Less(i, j int) bool {
    return pq[i].priority > pq[j].priority
}

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

func (pq *PriorityQueue) Push(x interface{}) {
    item := x.(*Item)
    *pq = append(*pq, item)
}

func (pq *PriorityQueue) Pop() interface{} {
    old := *pq
    n := len(old)
    item := old[n-1]
    old[n-1] = nil
    *pq = old[0 : n-1]
    return item
}

func main() {
    queue := new(PriorityQueue)
    heap.Init(queue)

    heap.Push(queue, &Item{value: "A", priority: 3})
    heap.Push(queue, &Item{value: "B", priority: 6})
    heap.Push(queue, &Item{value: "C", priority: 1})
    heap.Push(queue, &Item{value: "D", priority: 2})

    len := queue.Len()
    fmt.Println("优先队列长度:", len)

    item := (*queue)[0]
    fmt.Println("top 提取值: ", item.value)
    fmt.Println("top 提取优先级: ", item.priority)

    fmt.Println("遍历")
    for queue.Len() > 0 {
        fmt.Println(heap.Pop(queue).(*Item).value)
    }
}

更多代码 点击这里

参考:

后端程序员

144 声望
1 粉丝
0 条评论
推荐阅读
一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go32阅读 2.4k评论 1

封面图
前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin22阅读 3.2k评论 4

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 57.8k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.5k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 11.9k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.6k

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.2k

后端程序员

144 声望
1 粉丝
宣传栏