c语言中阶乘相加怎么表示_Go语言中怎么实现一个小根堆,Java程序员表示一顿操作猛如虎...

堆是我们一个常用的数据结构,堆是一个完全二叉树,下图是一个小根堆,小根堆的意思是对于树里面的所有节点,都是父节点小于任何一个子节点,今天我们来看一下Go中是怎么实现堆?

bce7f1fb8c1e0fbf859274757ccfd1d3.png

下面是Go语言中实现一个堆的代码,对于每一个堆,我们都需要实现5个方法,这点感觉比Java的优先队列要复杂得多了,分别是Len,用来计算容器得长度,Less返回两个元素得大小关系,Swap,用来交换两个数据。这几个实际上都是用来实现sort接口的。接下来,我们需要实现Push跟Pop方法,对于一个以前不是写Go语言的人,可能觉得这个实现其实很冗余,Push方法我们要做的就是往数据结构的最后面插入一个元素,而Pop则是弹出一个元素,弹出元素则是简单的把最后一个元素取出来。小根堆不是最前面的元素才是最小的么?为什么是取最后一个元素?

2e76506bdc92c1bdb0fc21291e2cb881.png

我们看一下go语言中,heap的源码,堆需要你实现Push跟Pop接口,因为继承了sort接口,所以又要实现上面3个比较方法。

b642fca6f25e7ff80b6d76e047963745.png

下面则是sort的接口,要求你实现长度,小于跟交换。

c4dd7d52183a50d69a6e7e46941ac524.png

接下来则是堆里面的push操作,先是调用了你实现的往末尾添加一个元素的接口,然后执行up操作,维护小根堆。up操作的目的是为了保证小根堆里面每一个结点都比子节点小。

7a36e0760ef4be431f4b4a120c57c3ca.png

刚刚我们提出一个疑问,小根堆不是最前面的元素才最小么?这里堆里面的Pop方法是先把最小的元素放到最后面,然后再来维护这个长度减一的小根堆。所以实际上你上面执行方法的时候,最后一个元素才是最小的!

这里不由感叹,还是Java的PriorityQueue封装的好,使用起来更加方便。虽然很多人特别推崇Go,但我觉得每种语言都有各自的优点缺点,都说Go写起来很方便,这不,还是Java大法好。

fe9d3a2e9ac72f7a0f3da70c8c989369.png

今天的介绍我们就讲到这里,如果你有兴趣,欢迎关注我,除了分享算法相关的,最近主要会讲一些redis的原理与应用。近期还准备了一些AI相关的知识,整理后会和大家继续分享。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值