# 20172320 2018-2019-1 《Java程序设计》第八周学习总结

Posted garolwz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# 20172320 2018-2019-1 《Java程序设计》第八周学习总结相关的知识,希望对你有一定的参考价值。

20172320 2018-2019-1 《Java程序设计》第八周学习总结

教材学习内容总结

  • 堆是一颗完全二叉树,分为最大堆(大顶堆)和最小堆(小顶堆);最小堆将其最小元素存储在二叉树的根处,其中每一个结点都小于或等于他的两个孩子;最大堆将其最大的元素存储在二叉树的根处,其中的结点都大于或等于他的左右孩子
  • 最小堆的最小元素存储在该二叉树的根处,且其根的两个孩子同样也是最小堆;最大堆同理
  • 堆得操作
操作 说明
addElement 将给定元素添加到该堆中
removeMin 删除堆得最小元素
findMin 返回一个指向堆中最小元素的引用
  • addElement方法将给定元素添加到堆中的适当位置中,且维持该堆的完全性属性和有序属性;插入位置要么在h层左边的下一个位置,要么是h+1层左边的第一个位置
    ···
    public void addElement(T obj)
    {
    if (count == tree.length)
    expandCapacity();

      tree[count] = obj;
      count++;
      modCount++;
    
      if (count > 1)
          heapifyAdd();

    }
    ···

  • removeMin方法将删除最小堆中的最小元素并返回它,由于最小元素在最小堆的根处,所以要用堆中的另一个元素代替它为维持该树的完全性,只有一个能替换的合法元素,且它是存储在树中最末一片叶子上的元素。最末一片叶子中的元素被移到了根处,必须对该堆进行重排序以维持排序属性
    ···
    public T removeMin() throws EmptyCollectionException
    {
    if (isEmpty())
    throw new EmptyCollectionException("ArrayHeap");

      T minElement = tree[0];
      tree[0] = tree[count-1];
      heapifyRemove();
      count--;
      modCount--;
    
      return minElement;
    }
    ···
  • 优先级队列:具有更高优先级的项目在先,具有相同优先级的项目使用先进先出方法来确定优先级;最小堆不是队列,但却提供了一个高效的优先级队列实现
  • 因为我们要求在插入元素后能够向上遍历该树,所以堆中结点必须存储指向双亲的指针
  • 在二叉树的数组实现中,树的跟位于0处,对于每一结点n,n的左孩子将位于数组的2n+1位置处,n的右孩子将位于数组的2(n+1)位置处
  • 链表和数组实现的addElement和removeMin操作时间复杂度为O(log n)

教材中遇到的问题和解决过程‘

  • 问题1:优先级队列的优先级怎么确定?堆怎么提供一个高效的优先级队列实现?
  • 解决方案:优先级的具体的优先比较算法由实现PriorityQueue接口的程序员来决定;由于堆的添加元素与删除元素时都会破坏堆结构,所以添加与删除进都要进行结构调整,优先级队列添加元素时会按照优先级添加,出队时从第一个开始,也就是最小堆的根元素(最小元素),这样就保证了具有更高优先级的项目在先,所以说最小堆提供了一个高效的优先级队列实现。

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

托管代码

技术分享图片

上周考试错题总结

  • A minheap stores its smallest element at the ________ of the binary tree.
    A .leaf
    B .internal node
    C .root
    D .sibling
    分析:C
    最小堆的将最小元素出存储在二叉树的根处
  • Both children of the root of a minheap are _________.
    A .Minheaps
    B .Maxheaps
    C .Heaps
    D .Binary search trees
    分析:A
    最小堆的最小元素存储在该二叉树的根处,且其根的两个孩子同样也是最小堆
  • To maintain the completeness of the tree, there is only one valid element to replace the ________, and that is the element stored in the last leaf in the tree.
    A .root
    B .internal node
    C .leaf
    D .tree
    分析:A
    为了保持树的完整性,需要一个元素来替代根的元素
  • A minheap stores its largest element at the root of the binary tree, and both children of the root of a minheap are also minheaps.
    A .True
    B .Flase
    分析:B
    最小堆的最小元素存储在该二叉树的根处,且其根的两个孩子同样也是最小堆
  • Typically, in heap implementations, we keep track of the position of the last node or, more precisely, the last leaf in the tree.
    A .True
    B .Flase
    分析:A
    通常,在堆实现中,我们跟踪最后一个节点的位置,或者更准确地说,跟踪树中的最后一片叶子
  • 结对及互评

点评过的同学博客和代码

  • 本周结对学习情况
    20172327
  • 结对学习内容
    ?阅读第12章节,运行教材上的代码
    ?完成程序设计项目PP12.1、PP12.8、PP12.9
    ?完成课后自测题,并参考答案学习

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/4 20/20
第二周 328/328 1/5 20/40
第三周 1597/ 1925 1/4 20/60
第四周 1153/3850 1/5 20/80
第五周 1583/5433 1/6 20/100
第六周 1515/6948 1/7 20/120
第七周 1145/8093 1/8 20/140
第八周 1665/9758 1/9 20/160

参考资料











































以上是关于# 20172320 2018-2019-1 《Java程序设计》第八周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

# 20172320 2018-2019-1 《Java程序设计》第八周学习总结

20172320 结对编程项目-四则运算 第二周 阶段总结

20172320 2017-2018-2 《程序设计与数据结构》实验四报告

20172320 2017-2018-2 《程序设计与数据结构》实验五报告

20172320 2017-2018-2 《程序设计与数据结构》实验二报告

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