堆 (heap) 是一种经过排序的完全二叉树,其中任一非叶子节点的值均不大于(或不小于)其左孩子和右孩子节点的值。

注:定义来自百度百科。

堆,又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。

其他概念解释

最大堆 根结点的键值是所有堆结点键值中最大者。

最小堆 根结点的键值是所有堆结点键值中最小者。

最小堆

最大堆

基本功能介绍及实现

在接下来的内容里,我们将逐步介绍堆的具体功能是如何实现的。

堆有两点需要了解,一是堆一般采用完全二叉树;二是堆中的每一个节点都大于其左右子节点(大顶堆),或者堆中每一个节点都小于其左右子节点(小顶堆)。

1. 创建 heap 类

class heap(object):

def __init__(self):

#初始化一个空堆,使用数组来在存放堆元素,节省存储

self.data_list = []

2. 添加 get_parent_index 函数

def get_parent_index(self,index):

#返回父节点的下标

if index == 0 or index > len(self.data_list) -1:

return None

else:

return (index -1) >> 1

3. 添加 swap 函数

def swap(self,index_a,index_b):

#交换数组中的两个元素

self.data_list[index_a],self.data_list[index_b] = self.data_list[index_b],self.data_list[index_a]

4. 添加 insert 函数

def insert(self,data):

#先把元素放在最后,然后从后往前依次堆化

#这里以大顶堆为例,如果插入元素比父节点大,则交换,直到最后

self.data_list.append(data)

index = len(self.data_list) -1

parent = self.get_parent_index(index)

#循环,直到该元素成为堆顶,或小于父节点(对于大顶堆)

while parent is not None and self.data_list[parent] < self.data_list[index]:

#交换操作

self.swap(parent,index)

index = parent

parent = self.get_parent_index(parent)

5. 添加 removeMax 函数

def removeMax(self):

#删除堆顶元素,然后将最后一个元素放在堆顶,再从上往下依次堆化

remove_data = self.data_list[0]

self.data_list[0] = self.data_list[-1]

del self.data_list[-1]

#堆化

self.heapify(0)

return remove_data

6. 添加 heapify 函数

def heapify(self,index):

#从上往下堆化,从index 开始堆化操作 (大顶堆)

total_index = len(self.data_list) -1

while True:

maxvalue_index = index

if 2*index +1 <= total_index and self.data_list[2*index +1] > self.data_list[maxvalue_index]:

maxvalue_index = 2*index +1

if 2*index +2 <= total_index and self.data_list[2*index +2] > self.data_list[maxvalue_index]:

maxvalue_index = 2*index +2

if maxvalue_index == index:

break

self.swap(index,maxvalue_index)

index = maxvalue_index

python堆_Python实现堆相关推荐

  1. python实现二叉堆中的大顶堆(大根堆)

    堆(英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值: 堆总是一棵完全二叉树. 将根 ...

  2. 浅谈大根堆,小根堆,以及堆排序(python)实现

    既然要说堆排序,那么必然要说说什么是大根堆,小根堆了. 大根堆: 若根节点存在左右子节点,那么根节点的值大于或等于左右子节点的值. 小根堆: 若根节点存在左右子节点,那么根节点的值小于或等于左右子节点 ...

  3. python优先队列_python实现最大优先队列

    本文实例为大家分享了python实现最大优先队列的具体代码,供大家参考,具体内容如下 说明:为了增强可复用性,设计了两个类,Heap类和PriorityQ类,其中PriorityQ类继承Heap类,从 ...

  4. 22-09-02 西安 JVM 类加载器、栈、堆体系、堆参数调优、GC垃圾判定、垃圾回收算法、对象的finalize机制

    这篇文章不少地方都截图了宋红康老师的课件,实在他jvm这块讲的真好.连接地址如下: 尚硅谷宋红康JVM全套教程(详解java虚拟机)_哔哩哔哩_bilibili JVM入门 1.JVM结构图 JVM是 ...

  5. 大根堆与小根堆的理解,如何手写一个堆,以及什么时候用自己手写的堆,什么时候用语言提供堆的api,(二者的区别)

    大根堆与小根堆的理解,如何手写一个堆,以及什么时候用自己手写的堆,什么时候用语言提供堆的api,(二者的区别) 定义 Heap是一种数据结构具有以下的特点: 1)完全二叉树: 2)heap中存储的值是 ...

  6. 【数据结构】堆,大根堆,小根堆,优先队列 详解

    目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...

  7. 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法

    内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...

  8. python画代码-Python教程_Python画Mandelbrot集 代码

    Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...

  9. LeetCode Find K Pairs with Smallest Sums(大根堆、小根堆)

    问题:给出两个有序数组nums1,nums2,要求从两个数组中各取一个数,组成一对数据,输出和最小的k对 思路:方法1使用大根堆,当堆中元素个数小于k时,直接入堆.否则比较当前数据对与堆顶的元素,如果 ...

最新文章

  1. SAP QM 含有HUM的检验批做UD时候的不同之处?
  2. 使用AppCompat项目模版
  3. ASP.NET ASHX中获得Session
  4. 重设忘记的Mysql密码
  5. windows无法新建计算机对象,win10系统ie浏览器提示“Automation 服务器不能创建对象”的办法...
  6. 【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?
  7. 图网络中的社群及社群发现算法
  8. 在tsx中引入less会提示模块找不到,但是可以运行
  9. Android零基础入门第83节:Activity间数据传递方法汇总
  10. Atitit.遍历图像像素点rgb java attilax总结
  11. Dxg——[版本管理工具Git SVN]开发笔记整理分类合集【所有的相关记录,都整理在此】
  12. 中台架构的未来在哪—开放式架构
  13. 行内元素之间产生的间隙
  14. Fedora 20 的 r8168 与 rtl8723be 驱动
  15. 冒泡排序基本思想及其复杂度分析
  16. 旅游 - 珠海长隆海洋王国 - 鹦鹉过山车
  17. 计算机操作系统英文论文,计算机操作系统英文论文
  18. MainWindow漫谈
  19. linux流媒体服务器架设
  20. 【人工智能】机器学习: Autoencoder 自编码器

热门文章

  1. c语言brr17,再说。brbr迷糊中,只听身边
  2. 赢在中国俞敏洪励志演讲
  3. 思科N3K交换机配置NAT
  4. edger多组差异性分析_转录组edgeR分析差异基因 | 生信菜鸟团
  5. 极客学院安卓视频零散笔记总结
  6. Unity打包失败的Bug:Could not resolve com.tencent.mm.opensdk:wechat-sdk-android:+.
  7. dlib各个版本的下载以及安装教程和使用
  8. python数据科学手册pdf百度云_Python数据科学手册
  9. iOS16.1 实时活动 (Live Activity)灵动岛适配
  10. 有n步台阶,一次只能上1步或2步,共有多少种走法?