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

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

教材学习内容总结

本章的内容主要讲堆的知识,而所谓堆就是一种具备一些特殊属性的树,就像二叉查找树同样。而堆也有两种分类,分别是html

  • 最大堆
    java

  • 最小堆
    git

可是不管是最大堆仍是最小堆的第一个特殊属性均为:算法

  • 堆必须是一棵彻底树。

第二个特殊属性是:api

  • 对于每个结点,它小于或等于/大于其左右孩子。

但本章的内容主要以最小堆为例,学会了最小堆能够类比退出最大堆的性质。数组

由于堆是一种含有特殊属性的树,因此在本章中堆继承了之前二叉树的全部性质,本章仅仅是在BinaryTreeADT基础上添加了addElementremoveMinfindMin方法。数据结构

  • addElemnt方法:由于堆是一个彻底树,因此说所添加元素的位置一定为堆的最后一层或最后一层以后的左边第一个位置。但在添加元素后还须要考虑整个堆的属性是否保持完成,因此说须要考虑从新排序。
  • removeMin方法:删除堆的根结点后从新排序。
  • findMin方法:简单的返回根结点的操做。

与以往相似,本次分别利用链表和数组实现堆。less

  • 链表实现堆:建立HeapNode类继承BinaryTreeNode类,但因为BinaryTreeNode无双亲结点的存在,因此在HeapNode中添加了一个双亲指针。(值得注意的是,添加双亲结点的缘由是:在咱们插入元素以后咱们须要向上遍历该树,因此必须存在一个指向双亲的指针
    • addElement方法的复杂度是O(logn),与此方法同时存在的是getNextParentAddheapifyAdd方法,他们用于返回插入结点的双亲的引用和对添加元素后的堆进行重排序。
    • removeMin方法的复杂度同为O(logn),与此方法同时存在的是getNewLastNodeheapifyRemove方法,他们用于返回新插入的节点和对删除元素后的堆进行重排序。
    • findMin方法:return root.element
  • 数组实现堆:与二叉树相同,对于任一结点n,n的左孩子将位于数组的2n+1位置处,n的右孩子将位于数组的2(n+1) 处,而对于任一非根结点m,m的双亲结点位于 (n-1)/2处,这意味着咱们利用数组实现堆不须要创建一个HeapNode类。
    • 利用数组实现堆的addElementremoveMinfindMin方法的解释与利用链表实现堆相似,我的以为无需过多言语。
  • 堆排序:这是一种全新的排序算法。这种排序算法彻底是根据堆的性质而思考出来的排序算法。以最小堆为例,每次将根结点与最后一个结点互换后,将最后一个结点提出树,这样就获得了一个最小的元素。在提出最小结点事后对树从新排序,以后重复以上两步操做直到排序完成。如图所示:

教材学习中的问题和解决过程

本章的内容就是对以前内容的简单拓展,实在是找不到什么问题。若是真的要我找一个问题就是:学习

  • 问题一:在书P265中偏下部有一句话“n的右孩子将位于数组的2(n+1)位置处固然,反过来......”,这句话一读就有问题。
  • 问题一解决方案:这句话应该为“n的右孩子将位于数组的2(n+1)位置处,固然反过来......”

代码调试中的问题和解决过程

  • 问题一:在完成PP12.1时,本身最初只是简单的觉得利用书上的优先队列的代码就能够完成,可是这好像是我没有认真读题。
  • 问题一解决方案:在结对伙伴范雯琪提醒下,本身重写了队列,在书上优先队列PriorityQueue的基础上删除了实现优先级的代码,就实现啦。

代码托管“点这里跳转到码云”

上周考试错题总结

  • 错题1:A binary search tree is a binary tree with the added property that the left child is greater than the parent, which is less than or equal to the right child.
  • A.True
  • B.False
  • 错题1解析:二叉排序树或者是一棵空树,或者是具备下列性质的二叉树,
    • 若左子树不空,则左子树上全部结点的值均小于它的根结点的值;
    • 若右子树不空,则右子树上全部结点的值均大于它的根结点的值;
    • 左、右子树也分别为二叉排序树;
    • 没有键值相等的节点。
  • 错题2:A binary search capitalizes on the fact that the list is not sorted.
  • A.True
  • B.False
  • 错题2解析:二叉查找树正式利用列表是被排序过才能进行搜索。
  • 错题3:A binary search can only be performed if the search pool is sorted.
  • A.True
  • B.False
  • 错题3解析:当查找池被排序好了之后就只能利用二叉查找树来搜索。

结对及互评

  • 博客中值得学习的或问题:
    • 范雯琪同窗的博客课本上的学习内容总结部分写得十分详细,值得学习。
    • 范雯琪同窗在博客中展现的图都很直观。
  • 代码中值得学习的或问题:
    • commit提交的解释清晰明了,我以为我应该学习。

点评过的同窗博客和代码

  • 本周结对学习状况
    • 20172303设计

    • 结对学习内容
      • 她提醒了个人PP12.1有点问题,感谢。

其余

  • 感悟:这周的知识仅仅是以前知识的一点点拓展,不难,可是也须要认真对待。

课本单词

(本部分用于收集本章节后的生词)

  • heap:堆
  • minheap:最小堆
  • maxheap:最大堆
  • complete binary tree:彻底二叉树
  • priority tree:优先树

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/5000 2/2 8/8 认真学习!积极向上
第二周 812/812 1/3 22/30
第三周 814/1626 1/4 20/50
第四周 1386/3012 2/6 20/70 愉快的国庆节就要结束了...
第五周 1222/3234 1/7 30/100
第六周 1327/4561 2/7 30/100 啦啦啦啦啦
第七周 1170/5631 1/8 33/133
第八周 1250/6881 2/10 30/163
  • 计划学习时间:25小时

  • 实际学习时间:30小时

  • 改进状况:根据学姐的建议改进了commit。

参考资料

相关文章
相关标签/搜索