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. CentOS 6.5环境下配置Arcgis Server 10.3

      感觉arcgis server在Windows系统下过于消耗资源,现将其配置到linux下,仅用于学习用.文中安装截图较多.因水平有限,难免有不周之处,请指教. 一.安装前准备 配置linux环境:此 ...

    2. typename在C++中的用法

      . //在C++中typename一般用来声明模板的模板参数(template parameter): template<typename T> class X; //T是一个模板参数 . ...

    3. react中手动重置redux

      前段时间使用redux在react-native中,安卓后退两次关闭后redux未清空的问题,一直觉得处理的不够优雅,没有根本解决问题. 后来发现再退出登录后,也有部分数据因为redux的逻辑处理数据 ...

    4. HBase数据访问的一些常用方式

      类型 特点 场合 优缺点分析 Native Java API 最常规和高效的访问方式 适合MapReduce作业并行批处理HBase表数据 Hbase Shell HBase的命令行工具,最简单的访问 ...

    5. 【BZOJ1046】[HAOI2007]上升序列

      [BZOJ1046][HAOI2007]上升序列 题面 bzoj 洛谷 题解 \(dp\)完之后随便搞一下即可,注意不要看错题 代码 #include <iostream> #includ ...

    6. P5231 [JSOI2012]玄武密码

      P5231 [JSOI2012]玄武密码 链接 分析: 首先对所有询问串建立AC自动机,然后扫描一遍母串,在AC自动机上走,没走到一个点,标记这个点走过了,并且它的fail树上的祖先节点也可以访问到( ...

    7. 【oracle查询】oracle查询字段显示#号 (井号)

      客户反映字段查询为井号,我自己没有遇到这种情况,于是上网百度了一下. 下面的答案很好地解决了问题,哈哈哈.

    8. CSS快速入门-浮动(float)

      一.float概述 浮动(float)是CSS布局常用的一个属性.它可以左右移动,直至它的外边缘碰到包含框或另一个浮动框的外边框. float被设计出来的初衷是用于文字环绕效果.如下代码: <! ...

    9. [VB.NET][C#]调用API获取或设置键盘按键状态

      前言 通过 C# 或 VB.NET,你只需编写少量的代码即可实现一个按键精灵. 第一节 接口 调用系统 API 实现获取或设置指定的按键状态. 获取按键状态 调用 GetAsyncKeyState() ...

    10. 交换机 路由器 OSI7层模型

      第1章 网络基础 1.1 网络的出现 解决计算机通讯的需求 实现计算机信息可以传递 1.2 主机之间实现通讯基本要求(三要素) ①. 需要在两台主机之间建立物理连接,物理连接的方式有网线 光纤线 wi ...