20162325 2017-2018-2 《程序设计与数据结构》第9周学习总结

教材学习内容概要


堆是一棵完全二叉树,其中每个元素大于等于其所有子结点的值。
向堆中添加一个元素的方法是,首先将这个元素添加为叶结点,然后将其向上移动到合适的位置。
从堆中删除最大元素的方法是,首先将这个元素的叶结点来取代根,然后将其向下移动到合适的位置。
堆排序利用堆的基本特性对一组元素进行排序。
优先队列不是FIFO队列。它根据优先级排列元素,而不是根据它们进入队列的次序来排序。


  • 堆的定义如下:
    (1)堆是一颗完全二叉树;
    (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值;
    (3)堆树中每个节点的子树都是堆树。
    当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆。如下图所示,左边为最大堆,右边为最小堆

  • 辨析(以最大堆为例):

这里需要注意的是:在多个子树中,并不是说其中一个子树的父结点一定大于另一个子树的儿子结点。最大堆是树结构,而且一定要是完全二叉树。

备注:本章集中讨论最大堆,所有的操作通过翻转比较运算后都可适用于最小堆。如有需要可参考最小堆 构建、插入、删除的过程图解-CSDN博客理解。

向堆中添加一个元素


  • 最大堆的插入操作可以简单看成是结点上浮。当我们在向堆中插入一个结点我们必须满足完全二叉树的标准,那么被插入结点的位置的是固定的。而且要满足父结点关键字值不小于子结点关键字值,那么我们就需要去移动父结点和子结点的相互位置关系。具体的位置变化,如下图:

  • 由于堆是一棵完全二叉树,存在n个元素,那么他的高度为:log2(n+1),这就说明代码中的for循环会执行O(log2(n))次。因此插入函数的时间复杂度为:O(log2(n))

从堆中删除最大元素


  • 最大堆的删除操作,总是从堆的根结点删除元素。同样根元素被删除之后为了能够保证该树还是一个完全二叉树,我们需要来移动完全二叉树的最后一个结点,让其继续符合完全二叉树的定义,从这里可以看作是最大堆最后一个结点的下沉(也就是下文提到的结点1)操作。例如在下面的最大堆中执行删除操作:

  • 现在对上面

    20162325 金立清 S2 W9 C18的更多相关文章

    1. 20162325 金立清 S2 W7 C16

      20162325 2017-2018-2 <程序设计与数据结构>第7周学习总结 教材学习内容概要 树是非线性结构,其元素组织为一个层次结构 树的度表示树种任意结点的最大子结点数 有m个元素 ...

    2. 20162325 金立清 S2 W5 C14

      20162325 2017-2018-2 <程序设计与数据结构>第5周学习总结 关键内容摘要 集合是收集并组织其他对象的对象 集合中的元素一般由加入集合的次序或元素之间某些固有的关系而组织 ...

    3. 20162325 金立清 S2 W3 C13

      20162325 2017-2018-2 <程序设计与数据结构>第3周学习总结 教材学习内容概要 查找是在一组项内找到指定目标或是确定目标不存在的过程 高效的查找使得比较的次数最少 Com ...

    4. 20162325 金立清 S2 W11 C20

      20162325 2017-2018-2 <程序设计与数据结构>第11周学习总结 教材关键概念摘要 在哈希方法中,元素保存在哈希表中,其在表中的位置由哈希函数确定. 两个元素或关键字映射到 ...

    5. 20162325 金立清 S2 W10 C19

      20162325 2017-2018-2 <程序设计与数据结构>第10周学习总结 认识 线性表和树两类数据结构,线性表中的元素是"一对一"的关系,树中的元素是" ...

    6. 20162325 金立清 S2 W6 C15

      20162325 2017-2018-2 <程序设计与数据结构>第6周学习总结 教材学习内容概要 队列是先进先出(FIFO)的集合 队列是保存重复编码k值的一种有效结构 实现模拟时常用队列 ...

    7. 20162325 金立清 S2 W8 C17

      20162325 2017-2018-2 <程序设计与数据结构>第8周学习总结 教材学习内容概要 二叉查找树是一棵二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,而右子树上的元素 ...

    8. 20162325金立清 实验四 Android程序设计 实验报告

      实验四 Android程序设计 实验报告 代码托管地址 码云链接 实验内容 安装使用Android Stuidio Activity测试 UI测试 布局测试 事件处理测试 Android程序设计-1 ...

    9. 2017-2018 第一学期201623班《程序设计与数据结构》-第9&10周作业问题总结

      一.作业内容 第8周作业 http://www.cnblogs.com/rocedu/p/7484252.html#WEEK08 第9周作业 http://www.cnblogs.com/rocedu ...

    随机推荐

    1. Android的JNI调用(三)

      注册JNI函数 注册之意就是将Java层的native函数与JNI层对应的实现函数关联起来,这样在调用Java层的native函数时,就能顺利转到JNI层对应的函数执行. (1)静态注册 根据函数名来 ...

    2. Blktrace原理简介及使用

      Blktrace简介 Blktrace是一个用户态的工具,用来收集磁盘IO信息中当IO进行到块设备层(block层,所以叫blk trace)时的详细信息(如IO请求提交,入队,合并,完成等等一些列的 ...

    3. Difference between link and @import

      原文don’t use @import Using @import within a stylesheet adds one more roundtrip to the overall downloa ...

    4. expdp导出时报错ora-16000

      一.问题现象:在对数据库进行expdp导出时发生报错ora-16000,脚本如下: nohup expdp "'/ as sysdba'" schemas=shp DIRECTOR ...

    5. Mysql5.7登录错误1045和1130的解决方法,亲测有用,希望能帮助到你们。

      Mysql (针对Mysql5.7版本,其他版本可能略有不同) 错误:1045 解决方法: 以管理员身份运行cmd(win8系统:win+x 键 ,再按 A键 ),进入Mysql安装目录下的bin目录 ...

    6. 一个简单python爬虫的实现——爬取电影信息

      最近在学习网络爬虫,完成了一个比较简单的python网络爬虫.首先为什么要用爬虫爬取信息呢,当然是因为要比人去收集更高效. 网络爬虫,可以理解为自动帮你在网络上收集数据的机器人. 网络爬虫简单可以大致 ...

    7. python 中的字符串格式化

      python 中的字符串格式化 %方式的调用 1.格式化代码 代码 意义 s 字符串,使用str r 字符串,使用repr不使用str c 字符 d 十进制的数字 i 整数 u 无符号整数 o 八进制 ...

    8. JavaWeb基础—邮件发送

      一.JavaMail概述与入门 JavaMail-java提供的一组API,用来收发邮件 中间有个邮件服务器: 客户端发给邮件服务器,另外一收件客户端从邮件服务器下载(最稳的还是163,QQ有点不靠谱 ...

    9. 使用cgroups来控制内存使用

      磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackga ...

    10. jQuery学习-键盘事件

      <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...