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
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

团体程序设计天梯赛-练习集L1-011 A-B (20分)getline输入

little tips&#xff1a;关于天梯赛不能用gets 题目&#xff1a; 本题要求你计算A−B。不过麻烦的是&#xff0c;A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉&#xff0c;剩下的字符组成的就是字符串A−B。 输入格式&#xff1a; 输入在2行中先后给出字…

Sql Server之旅——第八站 看公司这些DBA们设计的这些复合索引

这一篇再说下索引的最后一个主题&#xff0c;索引覆盖&#xff0c;当然学习比较好的捷径是看看那些大师们设计的索引&#xff0c;看从中能提取些什么营养的东西&#xff0c;下面我们看看数据库中一个核心的Orders表。一&#xff1a;查看表的架构1. 先查看这个表的大概架构信息-…

C++ setprecision()用法

io 流控制头文件, 主要是一些操纵用法如setw(int n),setprecision(int n) #include < iomanip > setw(n)用法&#xff1a; 通俗地讲就是预设宽度 #include<iostream> #include <iomanip> using namespace std;int main() {cout << setw(5) <<…

备战ccpc分站赛:秦皇岛和威海站(数论模块和dp模块)

挑战程序设计竞赛&#xff08;第2版&#xff09;练习题 tips&#xff1a;难度&#xff08;个人主观判断&#xff09;&#xff1a; 简单* 简单但卡思维 ** 中 *** 中稍加思考 **** 难 ***** 1 . 记录结果再利用的“动态规划” &#xff08;1&#xff09;基础的动态规划算法&am…

Go 排序方式

参考&#xff1a; https://segmentfault.com/a/1190000016514382 &#xff08;值得一看&#xff09; Go 常见排序方式 整数、浮点数、字符串切片排序 sort包提供了一下几种排序函数&#xff1a; sort.Ints(x []int)sort.Float64s(x []float64)sort.Strings(x []string) 使用…

15分钟从零开始搭建支持10w+用户的生产环境(四)

上一篇文章&#xff0c;介绍了这个架构中&#xff0c;WebServer的选择&#xff0c;以及整个架构中扩展时的思路。原文地址&#xff1a;15分钟从零开始搭建支持10w用户的生产环境(三)五、架构实践前边用了三篇文章&#xff0c;详细介绍了这个架构的各个部分的选择以及安装。这篇…

[Java基础]体验Stream流

代码如下: package StreamTest;import java.lang.reflect.Array; import java.util.ArrayList;public class StreamDemo {public static void main(String[] args){ArrayList<String> list new ArrayList<String>();list.add("Tom");list.add("ja…

Cow Bowling POJ - 3176(基础的动态规划算法)

题意&#xff1a; 杨辉三角&#xff0c;让从顶部开始走到底部&#xff0c;所经过的每一层的点数相加&#xff0c;使得实现最高和。 题目&#xff1a; The cows don’t use actual bowling balls when they go bowling. They each take a number (in the range 0…99), thoug…

[Java基础]Stream流的常见生成方式

1.Collection体系的集合可以使用默认方法stream()生成流 default Stream< E > stream() 代码如下: package StreamTest;import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Stream;public …

个人认为值得阅读的文章/博客

个人认为值得阅读的文章/博客 [典藏版] Golang 调度器 GMP 原理与调度全分析CDN是什么&#xff1f;使用CDN有什么优势&#xff1f;

Sumsets POJ - 2229(计数dp)

题意&#xff1a; 给一个数&#xff0c;是集合的总数和&#xff0c;集合元素只能为2的次幂数&#xff0c;问这样的集合有多少&#xff1f; 题目&#xff1a; Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows…

15分钟从零开始搭建支持10w+用户的生产环境(二)

上一篇文章&#xff0c;把这个架构的起因&#xff0c;和操作系统的选择进行了详细说明。原文地址&#xff1a;15分钟从零开始搭建支持10w用户的生产环境(一)二、数据库的选择对于一个10W用户的系统&#xff0c;数据库选择很重要。一般来说&#xff0c;这个用户量&#xff0c;根…

[Java基础]Stream流的常见中间操作方法

代码如下: package StreamTest;import java.util.ArrayList;public class StreamDemo02 {public static void main(String[] args){ArrayList<String> list new ArrayList<String>();list.add("Tom");list.add("Bom");list.add("jack&q…

GCD and LCM Aizu - 0005(辗转相除)+GCD LCM Inverse POJ - 2429(java或【Miller Rabin素数測试】+【Pollar Rho整数分解】)

题目&#xff1a;GCD and LCM Aizu - 0005 Write a program which computes the greatest common divisor (GCD) and the least common multiple (LCM) of given a and b. Input Input consists of several data sets. Each data set contains a and b separated by a singl…

云原生初探

文章目录什么是云原生&#xff1f;第二讲 容器的基本概念什么是容器&#xff1f;容器运行时的生命周期容器项目的架构容器和VM的差异第三讲 Kubernetes核心概念什么是KubernetesKubernetes架构Kubernetes核心概念和API第四讲 理解Pod和容器设计模式为什么Pod必须是原子调度单位…

15分钟从零开始搭建支持10w+用户的生产环境(三)

上一篇文章介绍了这个架构中&#xff0c;选择MongoDB做为数据库的原因&#xff0c;及相关的安装操作。原文地址&#xff1a;15分钟从零开始搭建支持10w用户的生产环境(二)三、WebServer在SOA和gRPC大行其道的今天&#xff0c;WebServer在系统中属于重中之重&#xff0c;是一个系…

[Java基础]Stream流终结操作之forEachcount

代码如下: package StreamTest;import java.util.ArrayList;public class StreamDemo06 {public static void main(String[] args) {ArrayList<String> list new ArrayList<String>();list.add("Jack");list.add("Tom");list.add("张敏…

Prime Number Aizu - 0009(素数筛)

题意&#xff1a; 给一个数n&#xff0c;问1~n内有多少个素数 题目&#xff1a; Write a program which reads an integer n and prints the number of prime numbers which are less than or equal to n. A prime number is a natural number which has exactly two distin…

实现.Net程序中OpenTracing采样和上报配置的自动更新

前言OpenTracing是一个链路跟踪的开放协议&#xff0c;已经有开源的.net实现&#xff1a;opentracing-csharp&#xff0c;同时支持.net framework和.net core&#xff0c;Github地址&#xff1a;https://github.com/opentracing/opentracing-csharp。这个库支持多种链路跟踪模式…

Golang中的error

文章目录Golang中的errorerror源码error创建Unwrap()、Is() 和 As()参考&#xff1a;https://www.flysnow.org/2019/09/06/go1.13-error-wrapping.html Golang中的error error源码 type error interface {Error() string }error 是一个接口类型&#xff0c;它包含一个 Error(…