Golang实现最大堆/最小堆

参考: https://yangjiahao106.github.io/2019/01/15/golang-%E6%9C%80%E5%A4%A7%E5%A0%86%E5%92%8C%E6%9C%80%E5%B0%8F%E5%A0%86/
https://studygolang.com/articles/24288

方法一

此方法就是比较传统、常见的方法,下面来构建一个最小堆:

type Heap struct {Size intElems []int
}func NewHead(maxSize int) *Heap {//minHead := new(Heap)//minHead.Elems = make([]int, maxSize, maxSize)//return minHeadminHead := Heap{Size: -1, Elems: make([]int, maxSize, maxSize)}return &minHead
}func (h *Heap) Push(x int)  {if h.Size == len(h.Elems) - 1 {return}h.Size++i := h.Size// 与父节点进行比较,如果小于父节点,则向上冒泡;否则,停止;for i > 0 {parent := (i - 1) / 2if h.Elems[parent] <= x {break}h.Elems[i] = h.Elems[parent]i = parent}h.Elems[i] = x
}func (h *Heap) Pop() int {if h.Size < 0 {return math.MinInt32}ret := h.Elems[0]// 将最后一个节点提到根节点,然后向下交换x := h.Elems[h.Size]i := 0for {l := 2*i + 1r := 2*i + 2if l >= h.Size {break}if r < h.Size && h.Elems[l] > h.Elems[r] {l = r}if x <= h.Elems[l] {break}h.Elems[i] = h.Elems[l]i = l}h.Size--h.Elems[i] = xreturn ret
}

测试:

func main() {minHead := NewHead(10)minHead.Push(2)minHead.Push(7)minHead.Push(5)minHead.Push(5)minHead.Push(4)minHead.Push(8)minHead.Push(8)minHead.Push(8)minHead.Push(8)minHead.Push(12)minHead.Push(20)k := minHead.Pop()for k != math.MinInt32 {fmt.Println(k)k = minHead.Pop()}
}/* output:24557888812
*/

一些其他的操作,可以在此基础进行扩充。

方法二

方法二看似要比方法一简单,首先需要介绍一下container/heap包,heap包对任意实现heap接口的类型提供堆操作。heap包中包含如下接口:

type Interface interface {sort.InterfacePush(x interface{}) // add x as element Len()Pop() interface{}   // remove and return element Len() - 1.
}// sort.Interface
type Interface interface {Len() intLess(i, j int) boolSwap(i, j int)
}

这里需要解释的应该只有Less(i, j int) bool 接口,我们查看sort.go源码时,会看到很多类似于下面这种代码:

if data.Less(m1, m0) {data.Swap(m1, m0)
}

所以,结果很明显,代码会根据Less()的结果来决定是否要交换data[i]data[j]
接下来,我们实现对应的接口:

type minHeap []intfunc (h minHeap) Len() int {return len(h)
}// 这里实现了小根堆,如果想要实现大根堆可以改为 h[i] > h[j]
func (h minHeap) Less(i, j int) bool {return h[i] < h[j]
}func (h *minHeap) Swap(i, j int)  {(*h)[i], (*h)[j] = (*h)[j], (*h)[i]
}func (h *minHeap) Push(x interface{})  {*h = append(*h, x.(int))
}func (h *minHeap) Pop() interface{} {res := (*h)[len(*h) - 1]*h = (*h)[:len(*h) - 1]return res
}

测试:

func main() {h := make(minHeap, 0)heap.Init(&h)heap.Push(&h, 2)heap.Push(&h, 7)heap.Push(&h, 5)heap.Push(&h, 5)heap.Push(&h, 4)heap.Push(&h, 6)for len(h) != 0 {fmt.Println(heap.Pop(&h))}
}/*output:245567
*/

Golang实现最大堆/最小堆相关推荐

  1. C++实现最大堆最小堆

    目录 堆和栈的区别 最大堆与最小堆 最大堆的操作 最大堆的插入操作 最大堆的弹出操作 最大堆的C++代码实现 最小堆概念 最小堆的插入操作 最小堆的弹出操作 最小堆的C++代码实现 最大堆最小堆的应用 ...

  2. java 最小堆_堆排序 最大堆 最小堆 Java 实现

    堆 一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1).但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点.建立最小堆需要额外空间? 不深究了,归并排序需要额外空间. 堆是完全二叉树 ...

  3. C++STL中的最大堆,最小堆

    堆,优先队列,头文件和队列是同一个#include<queue> #include<iostream> #include<queue> using namespac ...

  4. 最大堆最小堆的实现(C语言)

    ---------------- 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. ---------------- 堆是特殊的队列,从堆 ...

  5. C++ 最大堆最小堆与push_heap pop_heap

    make_heap:根据不同参数生成大顶堆或者小顶堆,默认大顶堆. make_heap(_RAIter,_RAIter) 默认生成大顶堆 make_heap(_RAIter,_RAIter,_Comp ...

  6. python 中的最大堆和最小堆(heapq库)

    目录 首先来看一下什么是最大堆和最小堆? python heapq库中的一些常用方法 小试牛刀 首先来看一下什么是最大堆和最小堆? 最大堆:一种经过排序的完全二叉树,其中任意非终端节点数值均不小于其左 ...

  7. WebServer代码解读(3)【最小堆定时器与队列】

    文章目录 1 - 处理事件 1-1 接收新连接 1-2 最小堆定时器 1-4 将request加入线程池 1-5 处理request 1 - 处理事件 因为epoll_wait函数已经返回了需要处理的 ...

  8. Leetcode295 数据流中的中位数-最小堆和最大堆

    题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如,[2,3,4] 的中位数是 3:[2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两 ...

  9. C++ 构建最小堆、最大堆

    堆的属性 完全二叉树 每个节点的值都大于(最大堆)或都小于(最小堆)子节点的值 堆只是一种数据的组织形式,存储结构可以用数组,在构建堆的过程中,可以使用完全二叉树的性质求父子节点的下标. 父节点的下标 ...

最新文章

  1. codeforces3A
  2. 尘埃落定!苹果 10 亿美元入局 5G,Intel 挥别 9 年基带业务
  3. 支付宝2018年账单发布,更注重用户隐私保护
  4. 二叉搜索树C++(VS2017)
  5. ubuntu mysql安装_在 Ubuntu 18.0-10上安装 MySQL8
  6. 装饰工程预结算教程电子书_东北分公司举行工程预结算实战技能培训
  7. 重读经典:《Generative Adversarial Nets》
  8. JavaScript:get和post的区别
  9. Latex学习笔记 (8) 字体样式之衬线字体与无衬线体字体
  10. [每日一氵] openCV drawMatches 函数中 flag 用法
  11. 简述完整的计算机组成部分组成部分组成,简述计算机系统的组成
  12. 嵌入式Linux--MYS-6ULX-IOT--构建交叉编译环境
  13. HDU - 6078 Wavel Sequence(动态规划+时间优化)
  14. Quartz入门教程
  15. STM32L476R快速入门——前期准备(项目设计专题)
  16. WWDC苹果开发者大会--直播
  17. 10、netty结合websocket完成消息的单发和群发
  18. 这篇3万字的Java后端面试总结,面试官看了瑟瑟发抖(汇总)
  19. html用divagt;做个按钮,Diva验证工具使用说明:
  20. Goland导入github包

热门文章

  1. 770天后,微博大变
  2. 使用 Sonatype Nexus 3 搭建 Maven 私服、本地私有 Maven 仓库,Gradle 打包 jar 、aar 后自动上传到 Nexus Maven 仓库配置
  3. 大家期待已久的Photoshop 2021终于推出了
  4. 中国科学院地理资源所成功举办“京区第六届地理学研究生学术论坛”
  5. 解决IDEA启动缓慢反应迟钝的问题
  6. 让皮肤美白水嫩的水果! - 健康程序员,至尚生活!
  7. wps图片与图片间距怎么调整_wps文档插入图片怎样中间空隙 具体方法介绍
  8. hyperic hq安装
  9. 木瓜移动出海助力超10000家企业打开全球市场
  10. idea html 插件安装,IntelliJ IDEA安装运行python插件方法