go语言heap包的使用

本文介绍了Go语言中heap包的使用,包括其源码分析、如何实现基于int和string数据集的二叉堆,并通过LeetCode问题215.数组中的第k个最大元素进行实战练习,展示了如何利用heap解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

go语言heap的使用

前言

在写算法的时候,遇到类似前n个最小值,最大值等问题,我们可以很容易想到堆来解。
go语言提供了一个heap的包,而不需要我们自己手动的去实现一个堆。
接下来学习一下它的使用。

container/heap 包的使用

源码分析

  1. heap里面有一个借口Interface,这个Interface就是我们需要实现的数据集,如下:
    在这里插入图片描述
    可以看到,在数据集里面还定义了一个sort.Interface
    在这里插入图片描述
    点进源码发现这是数据集的排序规则,所以要使用堆操作,我们首先得自定义一个数据集,实现heap接口的五个方法 Len(), Less(), Swap(), Push(), Pop()

例1:实现基于int数据集的二叉堆

模板

// 定义一个基于int数组的堆
type heap []int

// 重写 sort的三个方法
// 长度
func (h heap) Len() int {
   
	return len(h)
}

// 比较规则
func (h heap) Less(i, j int) bool {
   
	// 这里如果是小于,那么实现的是小根堆,如果是大于实现的是大根堆
	// 这是Swap的前置交换条件
	return h[i] < h[j]
}

// 交换规则
func (h heap) Swap(i, j int) {
   
	h[i], h[j] = h[j], h[i]
}

// 重写heap的push和pop方法
// 看源码知道,push方法只需要在数据集末尾增加值v
func (h *heap) Push(v interface{
   }) {
   
	*h = append(*h, v.(int))
}
// 看源码知道,pop方法是将最后一个值删除并返回
// 这个不好理解,按我们的理解,pop应该是取根节点 也就是删除第一个值
// 实际上注意我们使用的是工具包,这个Pop不是真正的Pop
// 工具包的Pop会将根节点和尾节点先进行交换,所以我们此时的Pop只需要删除最后一个值返回就好
func (h *heap) Pop() interface{
   } {
   
	last := len(*h)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值