前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang语言情怀-第51期 Go 语言标准库翻译 compress/heap

Golang语言情怀-第51期 Go 语言标准库翻译 compress/heap

作者头像
李海彬
发布2021-03-09 11:01:24
3970
发布2021-03-09 11:01:24
举报
文章被收录于专栏:Golang语言社区Golang语言社区

import "container/heap"

heap包提供了对任意类型(实现了heap.Interface接口)的堆操作。(最小)堆是具有“每个节点都是以其为根的子树中最小值”属性的树。

树的最小元素为其根元素,索引0的位置。

heap是常用的实现优先队列的方法。要创建一个优先队列,实现一个具有使用(负的)优先级作为比较的依据的Less方法的Heap接口,如此一来可用Push添加项目而用Pop取出队列最高优先级的项目。

代码语言:javascript
复制
type Interface
func Init(h Interface)
func Push(h Interface, x interface{})
func Pop(h Interface) interface{}
func Remove(h Interface, i int) interface{}
func Fix(h Interface, i int)
  • package (IntHeap)
  • package (PriorityQueue)

type Interface

代码语言:javascript
复制
type Interface interface {
    sort.Interface
    Push(x interface{}) // 向末尾添加元素
    Pop() interface{}   // 从末尾删除元素
}

任何实现了本接口的类型都可以用于构建最小堆。最小堆可以通过heap.Init建立,数据是递增顺序或者空的话也是最小堆。最小堆的约束条件是:

代码语言:javascript
复制
!h.Less(j, i) for 0 <= i < h.Len() and 2*i+1 <= j <= 2*i+2 and j < h.Len()

注意接口的Push和Pop方法是供heap包调用的,请使用heap.Push和heap.Pop来向一个堆添加或者删除元素。

func Init

代码语言:javascript
复制
func Init(h Interface)

一个堆在使用任何堆操作之前应先初始化。Init函数对于堆的约束性是幂等的(多次执行无意义),并可能在任何时候堆的约束性被破坏时被调用。本函数复杂度为O(n),其中n等于h.Len()。

func Push

代码语言:javascript
复制
func Push(h Interface, x interface{})

向堆h中插入元素x,并保持堆的约束性。复杂度O(log(n)),其中n等于h.Len()。

func Pop

代码语言:javascript
复制
func Pop(h Interface) interface{}

删除并返回堆h中的最小元素(不影响约束性)。复杂度O(log(n)),其中n等于h.Len()。等价于Remove(h, 0)。

func Remove

代码语言:javascript
复制
func Remove(h Interface, i int) interface{}

删除堆中的第i个元素,并保持堆的约束性。复杂度O(log(n)),其中n等于h.Len()。

func Fix

代码语言:javascript
复制
func Fix(h Interface, i int)

在修改第i个元素后,调用本函数修复堆,比删除第i个元素后插入新元素更有效率。

复杂度O(log(n)),其中n等于h.Len()。


参考资料:

Go语言中文文档

http://www.golang.ltd/

Go语言官方文档

https://golang.google.cn/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言情怀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • type Interface
  • func Push
  • func Pop
  • func Remove
  • func Fix
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档