Golang实现最大堆/最小堆
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实现最大堆/最小堆相关推荐
- C++实现最大堆最小堆
目录 堆和栈的区别 最大堆与最小堆 最大堆的操作 最大堆的插入操作 最大堆的弹出操作 最大堆的C++代码实现 最小堆概念 最小堆的插入操作 最小堆的弹出操作 最小堆的C++代码实现 最大堆最小堆的应用 ...
- java 最小堆_堆排序 最大堆 最小堆 Java 实现
堆 一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1).但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点.建立最小堆需要额外空间? 不深究了,归并排序需要额外空间. 堆是完全二叉树 ...
- C++STL中的最大堆,最小堆
堆,优先队列,头文件和队列是同一个#include<queue> #include<iostream> #include<queue> using namespac ...
- 最大堆最小堆的实现(C语言)
---------------- 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. ---------------- 堆是特殊的队列,从堆 ...
- C++ 最大堆最小堆与push_heap pop_heap
make_heap:根据不同参数生成大顶堆或者小顶堆,默认大顶堆. make_heap(_RAIter,_RAIter) 默认生成大顶堆 make_heap(_RAIter,_RAIter,_Comp ...
- python 中的最大堆和最小堆(heapq库)
目录 首先来看一下什么是最大堆和最小堆? python heapq库中的一些常用方法 小试牛刀 首先来看一下什么是最大堆和最小堆? 最大堆:一种经过排序的完全二叉树,其中任意非终端节点数值均不小于其左 ...
- WebServer代码解读(3)【最小堆定时器与队列】
文章目录 1 - 处理事件 1-1 接收新连接 1-2 最小堆定时器 1-4 将request加入线程池 1-5 处理request 1 - 处理事件 因为epoll_wait函数已经返回了需要处理的 ...
- Leetcode295 数据流中的中位数-最小堆和最大堆
题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如,[2,3,4] 的中位数是 3:[2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两 ...
- C++ 构建最小堆、最大堆
堆的属性 完全二叉树 每个节点的值都大于(最大堆)或都小于(最小堆)子节点的值 堆只是一种数据的组织形式,存储结构可以用数组,在构建堆的过程中,可以使用完全二叉树的性质求父子节点的下标. 父节点的下标 ...
最新文章
- codeforces3A
- 尘埃落定!苹果 10 亿美元入局 5G,Intel 挥别 9 年基带业务
- 支付宝2018年账单发布,更注重用户隐私保护
- 二叉搜索树C++(VS2017)
- ubuntu mysql安装_在 Ubuntu 18.0-10上安装 MySQL8
- 装饰工程预结算教程电子书_东北分公司举行工程预结算实战技能培训
- 重读经典:《Generative Adversarial Nets》
- JavaScript:get和post的区别
- Latex学习笔记 (8) 字体样式之衬线字体与无衬线体字体
- [每日一氵] openCV drawMatches 函数中 flag 用法
- 简述完整的计算机组成部分组成部分组成,简述计算机系统的组成
- 嵌入式Linux--MYS-6ULX-IOT--构建交叉编译环境
- HDU - 6078 Wavel Sequence(动态规划+时间优化)
- Quartz入门教程
- STM32L476R快速入门——前期准备(项目设计专题)
- WWDC苹果开发者大会--直播
- 10、netty结合websocket完成消息的单发和群发
- 这篇3万字的Java后端面试总结,面试官看了瑟瑟发抖(汇总)
- html用divagt;做个按钮,Diva验证工具使用说明:
- Goland导入github包
热门文章
- 770天后,微博大变
- 使用 Sonatype Nexus 3 搭建 Maven 私服、本地私有 Maven 仓库,Gradle 打包 jar 、aar 后自动上传到 Nexus Maven 仓库配置
- 大家期待已久的Photoshop 2021终于推出了
- 中国科学院地理资源所成功举办“京区第六届地理学研究生学术论坛”
- 解决IDEA启动缓慢反应迟钝的问题
- 让皮肤美白水嫩的水果! - 健康程序员,至尚生活!
- wps图片与图片间距怎么调整_wps文档插入图片怎样中间空隙 具体方法介绍
- hyperic hq安装
- 木瓜移动出海助力超10000家企业打开全球市场
- idea html 插件安装,IntelliJ IDEA安装运行python插件方法