目录

  • 最大堆(大顶堆):堆顶元素保持最大
  • 最小堆(小顶堆):堆顶元素保持最小
    • 1、堆的结构
    • 2、向堆中插入元素
    • 3、弹出堆中元素
    • 4、go中的堆

最大堆(大顶堆):堆顶元素保持最大

最小堆(小顶堆):堆顶元素保持最小

1、堆的结构

堆是一种完全二叉树(完全二叉树是满二叉树的一部分),根据树的结构可以通过数组来进行表示,如下图中的完全二叉树可以表示为右侧的数组

作为大顶堆时,还需遵循以下特性:

  1. 根节点为整个堆的最大值
  2. 每个节点的值都不小于它的子节点

对应到数组中:

  1. a[1]为最大值

  2. 节点为i,则子节点为2i和2i+1,即a[i]>=a[2i] && a[i]>=a[2i+1]

  3. 节点为i,则父节点为i/2

2、向堆中插入元素

插入新元素时,需要寻找其在数组中的位置

//less()比较元素大小,exch()交换两元素位置
func push(k int, datas *[]int){for i>1 && less((*datas)[i/2],(*datas)[i]){   //比较i/2和i位置元素的大小,比较至根节点时退出exch(&(*datas)[i/2], &(*datas)[i])   // i/2位置元素小于i位置元素,说明父节点元素小于子节点,需要交换i = i/2}
}func less(a int,b int) bool{return a < b
}

3、弹出堆中元素

弹出最大元素,将最后一个元素与最大元素交换,然后调整此时最后一个元素的位置到正确的位置

func pop(i int, datas []int){length:=len(datas)-2for 2*i<=length{max:=0if 2*i<length && less(datas[2*i], datas[2*i+1]){  //找两个子节点2i和2i+1中的最大值max=2*i+1}if !less(datas[i], datas[max]){  // 父节点大于子节点,交换结束break}// 子节点大于父节点,交换exch(&datas[i], &datas[max])i = max}
}

4、go中的堆

go中提供了 container/heap 来实现堆,堆中元素的类型需要实现 heap.Interface 这个接口。

下面是最大堆示例:

type IntHeap []intfunc (h IntHeap) Len() int           { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] > h[j] }
//最小堆
//func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h IntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }func (h *IntHeap) Push(x interface{}) {*h = append(*h, x.(int))
}
func (h *IntHeap) Pop() interface{} {old := *hn := len(old)x := old[n-1]*h = old[0 : n-1]return x
}func main()  {h := &IntHeap{3, 1, 2, 5}heap.Init(h)heap.Push(h, 4)for h.Len() > 0 {fmt.Printf("%d ", heap.Pop(h))}
}

如有不对,烦请指出~

go --- 最大堆和最小堆相关推荐

  1. C++判断一个序列是否为堆(最大堆、最小堆)

    参考:https://blog.csdn.net/guoweimelon/article/details/50904346 1.如何判断一个序列是不是堆? 把这个序列看成是数组型的二叉树,如果根节点是 ...

  2. 最大堆和最小堆和平衡二叉树_最小堆二叉树

    最大堆和最小堆和平衡二叉树 A Min Heap Binary Tree is a Binary Tree where the root node has the minimum key in the ...

  3. 最大堆和最小堆(数据结构)

    堆和栈的区别: 一.空间分配区别: 栈(操作系统):由操作系统自动分配释放,存放函数的参考值,局部变量的值等.其操作方式类似于数据结构中的栈 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序 ...

  4. 2020 C++ priority_queue 最大堆与最小堆介绍

    文章目录 1.问题描述 2.具体分析 3.其他方式 4.用最小堆解决问题 1.问题描述 通常在刷题的时候,会遇到最大堆.最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何 ...

  5. 堆(一)最大堆和最小堆的实现

    最大堆和最小堆的实现 这一讲讲的还是堆,因此将它归入到堆(一)中.这一篇博客的目的非常简单,就是补充一下堆的实现代码.Heap是抽象类,它有两个子类,MaxHeap和MinHeap.回顾一下堆的性质: ...

  6. 最大堆和最小堆基本概念(以及栈和堆的区别)

    堆和栈的区别: 一.堆栈空间分配区别: 1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈: 2.堆(操作系统): 一般由程序员分配释放, ...

  7. C++实现最大堆和最小堆

    堆 堆数据结构是一种数组对象,它可以被视为一颗完全二叉树结构(或者也有可能是满二叉树) 最大堆: 任一结点的关键码均大于等于它的左右孩子的关键码,其中堆顶的元素最大.(任一路径中的元素升序排列) 最小 ...

  8. 数据结构——最大堆和最小堆(C语言)

    定义: 最大堆和最小堆都是一棵完全二叉树. 最大堆:是指根节点的关键字值是堆中的最大关键字值,且每个节点若有儿子节点,其关键字值都不小于其儿子节点的关键字值. 最小堆:是指根节点的关键字值是堆中的最小 ...

  9. 使用最大堆和最小堆实现中位数的查找

    参考链接:双堆维护数组中位数 用堆维护中位数的意思是说,设计两个堆,第一个堆(大顶堆)存放小于中位数的元素,第二个堆(小顶堆)存放大于中位数的元素. 下面是双堆维护中位数的语言描述: 1.初始化的时候 ...

  10. 最大堆、最小堆的建立、插入和删除操作

    堆数的定义 堆树的定义如下: (1)堆树是一颗完全二叉树: (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值: (3)堆树中每个节点的子树都是堆树. 当父节点的键值总是大于或等于任何一个子节点 ...

最新文章

  1. 天天用着Redis集群,主从同步该知道吧?集群工作原理是否需要了解下?
  2. linux怎么确认oracle已启动,怎么设置在Linux启动后,Oracle也启动,监听也启动
  3. 强连通 Tarjan
  4. JetBrains 第二轮:再为免费全家桶续命三个月
  5. python select模块_Python之select模块解析
  6. 谁说Python的shutil不支持7z解压缩,我来教你扩展它的功能!
  7. OCP学习和培训ppt汇总
  8. gridview中js的绑定问题 一个js的函数[转]
  9. 编译Libgdiplus遇到的问题
  10. 2017年最值得关注的5大产品设计趋势
  11. 如何在阿里云建立网站
  12. cad2006计算机丢失,win10系统无法打开CAD2006提示“计算机中丢失ac1st16.dll”的解决方法...
  13. 17*开头的是什么号码?为什么17开头手机号最好不要用
  14. 计算机网络基础冷知识,技术控必备冷知识
  15. 讯飞 AIUI 集成
  16. sudo vim找不到
  17. 复购率/回购率/新购人数
  18. python画脑电信号
  19. android 13 WMS/AMS系统开发-窗口层级相关SurfaceFlinger图层创建 第三节
  20. 小米路由器的服务器无响应怎么回事,小米路由器常见问题与解决方法(高级功能) | 192路由网...

热门文章

  1. 青海行--(7月23日)神奇的柴旦湖
  2. 如何用计算机伴奏音乐,qq音乐2016电脑版怎么设置伴唱和伴奏?
  3. 写求职信的10条必要规则
  4. VR全景制作之全景拍摄
  5. 专家推荐切,老掉牙的TCP知识
  6. php微信推文大图,微信公众号图文排版?看这一篇就够了
  7. 固定于计算机主机箱中承载,一种计算机用主机箱的制作方法
  8. 打开地图小册子CSS动画
  9. 守护进程二三事与Supervisor
  10. Web前端学习笔记:day01(HTML)