20172319 《程序设计与数据结构》 第八周学习总结

本文总结了《程序设计与数据结构》第八周的学习内容,重点介绍了优先队列与堆的概念,包括最小堆和最大堆的特点,以及addElement、removeMin和findMin等基本操作的实现方法。同时,探讨了使用链表和数组实现堆的不同方式,以及堆排序的时间复杂度。

20172319 2018.11.04-11.11

《程序设计与数据结构》第8周学习总结

目录

教材学习内容总结
第十二章 优先队列与堆
  • 12.1 堆:

  • 堆(heap) : 具有两个附加属性 的二叉树;是一棵完全二叉树。
  • 最小堆(minheap) : 每一结点小于或等于其两个孩子;其根的两个孩子同样为最小堆。
    1334495-20181110214749763-1769615623.png

  • 最大堆(maxheap) : 每一结点大于或等于其两个孩子;其根的两个孩子同样为最大堆。
    1334495-20181110213645241-2010287776.png

  • 元素相同,构造的堆也可以不同:
    1334495-20181110214105075-507537298.png

  • 堆的操作
  • 操作说明
    addElement将给定元素添加到该堆中
    removeMin删除堆的最小元素
    findMin返回一个指向堆中最小元素的引用
  • 12.1.1 addElement操作:
  • 将给定的元素添加至适当位置,并维持好该堆的完全性和有序性
  • 对于堆而言,因为其是一棵完全二叉树,所以在插入时会保持其完全性,所以对于新插入的结点来说,只存在一个正确的位置:要么其为h层左边的下一个空位置,要么其为h+1层左边的第一个位置。
  • 1334495-20181111101354497-1730172448.png

  • 12.1.2 removeMin操作:
  • 删除堆的最小元素并返回;
  • 用最末端的叶子替代根;
  • 重构堆。
    1334495-20181111104520545-1033171051.png

  • 12.1.3 findMin操作:
  • 堆的根处存储的是堆中的最小元素,因此只需返回其即可。

  • 12.2 使用堆:优先级队列
  • 优先级队列(priority queue) 和通常的栈和队列一样,但里面的每一个元素都有一个优先级 ,在处理的时候,首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理。

  • 虽然堆并非一个队列,但其提供了一个高效 的优先级队列实现。

  • 12.3 使用链表实现堆
  • 为能向上遍历树,每个结点存储了指向双亲的指针。

  • 12.3.1 addElement操作:
  • 在恰当位置添加一个新元素
  • 对堆进行重排序以维持其排序属性
  • lastNode指针重新设定为指向最新的最末结点
  • 时间复杂度O(log n)

  • 12.3.2 removeMin操作:

  • 用存储在最末结点处的元素替换存储在根处的元素
  • 对堆进行重排序
  • 返回初始根元素
  • 时间复杂度O(log n)
  • 12.3.3 findMin操作:

  • 返回指向存储在堆根处元素的引用
  • 时间复杂度为O(1)

  • 12.4 使用数组实现堆

  • 树根位于位置0处;
  • 左孩子位于2n+1处
  • 右孩子位于2(n+1)处

  • 12.4.1 addElement操作:
  • 在恰当位置添加一个新元素
  • 对堆进行重排序以维持其排序属性
  • count递增加1
  • 时间复杂度O(log n)

  • 12.4.2 removeMin操作:

  • 用存储在最末结点处的元素替换存储在根处的元素
  • 对堆进行重排序
  • 返回初始根元素
  • 时间复杂度O(log n)
  • 12.4.3 findMin操作:

  • 返回指向存储在堆根处元素的引用(该引用指向存储在堆的根处或数组位置0处的元素)
  • 时间复杂度为O(1)

  • 12.5 使用堆:堆排序

  • 添加列表中的每个元素
  • 一次删除一个元素

  • 时间复杂度为O(n log n)

返回目录


教材学习中的问题和解决过程
  • 问题1:2-3-4树?
  • 解决:

返回目录


代码调试中的问题和解决过程
  • 问题1:如何删除某一指定结点的子树。

  • 解决:

返回目录


代码托管

1334495-20181111161236013-1566831322.png

返回目录


上周考试错题总结
  • 错题1:上周无任何错题。
  • 解决:
  • 错题2:
  • 解决:
  • 错题3:
  • 解决:

返回目录


结对及互评
点评过的同学博客和代码
  • 本周结对学习情况
    • 20172316赵乾宸
    • 博客中值得学习的或存在问题:
    • 20172329王文彬
    • 博客中值得学习的或存在问题:
    • 博客内容充实、排版整齐、对教材内容有经过一番认真思考、继续保持。
    • 代码截图做标注时应尽量避免遮挡代码。
    • Markdown的部分缩进有误。
    • 教材问题2提出得很好,可以看出近断时间来反复使用链表、数组去实现同一类型的数据结构起得了一定的成效。

返回目录


学习进度条
代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)
目标3000行15篇300小时
第一周0/01/112/12
第二周935/9351/224/36
第三周849/17841/334/70
第四周3600/53841/550/120
第五周2254/76381/750/170
第六周2809/104471/945/215
第七周3700/141471/1040/255
第八周3422/175691/1136/291

返回目录


参考资料

转载于:https://www.cnblogs.com/Tangcaiming/p/9940677.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值