堆的简单实现与代码实现

堆的定义

在定义堆(heap)之前,先回顾一下完全二叉树的定义:

  • 完全二叉树:除了最后一层的结点有可能没有达到最大值外,其它层的结点值都达到最大值,此外最后一层的叶子结点会尽可能连续集中在左边
  • 堆的基本定义:堆是一种是基于树的专用数据结构,一般是将一颗完全二叉树的结点按照层序遍历的顺序存于数组中来实现的

堆具有以下几个特性

  • 在堆中,最高(或最低)优先级的元素始终都存储在堆的根目录(第一个储存元素的位置)
  • 堆中的父结点优先级总是大于等于(或小于等于)其子结点,但是其子结点并没有大小顺序之分,因此堆不能称作一种顺序数据结构,但是可以被当做是一种部分排序的储存结构
  • 堆的层次之间存在一个特殊关系,利用这个关系,可以代替索引的功能,找到对应的元素

堆的层次关系:

  • 如果一个结点的位置为k ,则它的父结点的位置为[k/2],而它的两个子结点的位置则分别为2k和2k+1。
  • 这样,在不使用指针的情况下.也可以通过计算数组的索引|在树中上下移动:从a[k]向上一层,就令k等于k/2,向下一层就令k等于2k或2k+1。

    这里0索引不使用,因为索引从1开始会让操作更方便

堆中插入元素append()使用的排序方法之一上浮swim()过程

堆中删除最大元素的排序方法之一下沉sink()过程

下面用代码实现堆,层次往下时元素的值从大到小排列

堆的操作方法

  1. less()比较插入堆中的结点与当前节点的大小,辅助排序
  2. swap()交换结点的值,一般与less合用,达到排序效果
  3. append()向堆中尾部插入一个元素,其内部的swim()利用了堆的层次关系对元素进行上浮操作,实现父子结点间的大小排序
  4. delete_max()删除最大元素,并返回其最大值,其内部的sink()利用了堆的层次关系对元素进行下沉操作,实现父子结点间的大小排序

堆的Python代码实现

import operatorclass Heap:def __init__(self):self.items = [None]self.N = 0  # The size of this heapdef less(self, i, j):return operator.lt(self.items[i], self.items[j])def swap(self, i, j):self.items[i], self.items[j] = self.items[j], self.items[i]def append(self, item):"""Append an element to its tail and do not use the index 0"""self.items.append(item)self.N += 1def swim(k):"""Adjust the element's position, keeping the heap sequential"""while k > 1:if self.less(int(k / 2), k):self.swap(int(k / 2), k)k = int(k / 2)swim(self.N)def delete_max(self):"""Delete the max value(the item where index=1) in this heap and return it"""if self.N < 1:return# Swap items[1] with items[-1]_max = self.items[1]self.swap(1, self.N)# Delete items[-1]del self.items[self.N]# The length of this heap subtract 1self.N -= 1# print(f"Length: {self.N}, Length-real: {len(self.items)-1}")# Sink() to adjust the sequence of this heapdef sink(k):"""Compare the current element with the max of its child nodes"""while 2 * k <= self.N:# Take the max child's indexindex_of_max_child = 2 * k if 2 * k + 1 > self.N else \(2 * k + 1 if self.less(2 * k, 2 * k + 1) else 2 * k)# When we found the position in where it should be, break the loopif self.less(index_of_max_child, k):break# Else, swap the current node's value with its max child node's valueself.swap(k, index_of_max_child)# Swap the current index with index_of_max_child, continue to do the while loopk = index_of_max_childsink(1)# Return the max valuereturn _max

代码测试

if __name__ == '__main__':heap = Heap()heap.append('A')heap.append('B')heap.append('C')heap.append('D')heap.append('E')heap.append('F')heap.append('G')print(heap.N)# Iteratively delete the element in this heapres = heap.delete_max()while res:print(res, end=' ')res = heap.delete_max()

测试结果

7
G F E D C B A

是从小到大插入的元素,但是是依次取出最大元素,所以结果是从大到小排列(注意根据插入顺序的不同,可能中间会有元素不是按照大小顺序排放,但是整体是从大到小排列的)

数据结构之堆:堆的介绍与python实现——12相关推荐

  1. 0x17.基础数据结构 - 二叉堆

    目录 一.二叉堆 二.例题 0.AcWing 145. 超市 AcWing 146. 序列(POJ 2442) 三.HuffmanHuffmanHuffman树 1.AcWing 148. 合并果子 ...

  2. 数据结构与算法 | 堆

    二叉树的顺序结构 堆的概念及结构 堆的实现 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费.而完全二叉树更适合使用顺序结构存储.现实中我们通常把堆(一种二叉树)使用 ...

  3. 数据结构-二叉树和堆的实现

    二叉树 树的概念和结构 概念 结构 树的其他概念名词 树的孩子兄弟表示法 树的实际应用 二叉树的概念和结构 概念 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的顺序结构-堆 堆的实现 堆的向下 ...

  4. 数据结构与算法---堆的基本操作

    堆的定义 堆可以看做是一种特殊的树,堆结构满足两个条件: 1.堆是一个完全二叉树. 2.堆的每一个节点的值都大于等于(或小于等于)其子节点的值. 大于等于子节点的值我们叫它:大顶堆 小于等于子节点的值 ...

  5. 【数据结构入门】堆(Heap)

    文章目录 一.堆的结构及实现(重要) 1.1 二叉树的顺序结构 1.2 堆的概念及结构 1.3 堆的实现 1.3.1 堆的向下调整算法 1.3.2 向下调整算法的时间复杂度 1.3.3 堆的创建(向下 ...

  6. 数据结构之平衡树:红黑树的介绍与Python代码实现——17

    红黑树的介绍与Python代码实现 红黑树的介绍 红黑树(Red-Black Tree)是一种平衡二叉查找树,它是一种以比较简单的方式实现的2-3查找树 红黑树基于2-3查找树的表现 红链接:将两个2 ...

  7. 数据结构基础(19) --堆与堆排序

    完全二叉树 首先让我们回顾一下完全二叉树的两个性质: 性质1:具有n个结点的完全二叉树的深度为[logn](向下取整)+1. 性质2:若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n  ...

  8. 数据结构:“大根堆、小根堆”的向上调整算法和向下调整算法

    堆 堆是一种特殊的完全二叉树. 堆有两种类型:大根堆和小根堆. 例1中的完全二叉树符合所有父亲节点的数据小于其孩子节点的,故为小根堆: 例2中的完全二叉树符合所有父亲节点的数据大于其孩子节点的,故为大 ...

  9. 排序算法基本介绍及python实现(含详细注释)

    对数组排序可以说是编程基础中的基础,本文对八种排序方法做简要介绍并用python实现. 代码中注释很全,适合复习和萌新学习.这是刚入学自己写的,可能难免比不上标准的写法,但是懒得改了. 文末会放和排序 ...

最新文章

  1. 乐视手机没有logcat日志_盘点国产品牌手机,联想,魅族,一加有你用过的那款吗?...
  2. 浙江大学计算机视频 百度云,浙江大学 数据结构与算法 全40讲 徐镜春 视频教程...
  3. bzoj千题计划262:bzoj4868: [六省联考2017]期末考试
  4. Java8 Stream详解~筛选:filter
  5. 直接拿来用!GitHub10个开源免费的后台管理面板
  6. java ui线程_UI线程异常处理方法
  7. CSS基础「四」浮动 \ 常见网页布局
  8. java布尔方法_Java布尔方法返回
  9. ShaderLab学习总结
  10. python的第三方库是干什么用的-python一些工作用到的第三方库
  11. Oracle - 查询语句 - 多表关联查询
  12. docker学习 主流的pass平台(体验的是设计模式)
  13. 忘记数据库密码,修改数据库密码(亲测有效)
  14. 微信小程序 - 手机拍摄图片或选择相册图片上传到服务器(带图片预览与删除功能)
  15. meson ninja调试dpdk
  16. 4条地铁线,乘船到西站!杭州西站枢纽综合交通规划设计方案出炉
  17. 换个视角!那么用户到底想要怎么样的产品?
  18. 数位DP(期末机测题)
  19. 解密双十一、618电商大促数据大屏指标实现原理
  20. c语言蟠桃记程序,HDU2013 蟠桃记

热门文章

  1. 真格量化——菜粕策略
  2. 订单编号,递增且不连续(php版)
  3. python将字符串写入csv_用Python将字符串值写入CSV文件
  4. 深度学习目标检测之 YOLO v4
  5. 电子科学与技术相关索引汇总
  6. python中错误和异常处理
  7. 利用Sqoop在数据库和Hive、HDFS之间做ETL操作
  8. 微型计算机选用要点,微型计算机原理以及应用考试_new要点分析.doc
  9. 设计模式之单例模式(C++代码实现)
  10. sd_fusing.sh将uboot烧写到SD卡