# 20172333 2018-2019-1 《程序设计与数据结构》第八周学习总结

20172333 2018-2019-1 《程序设计与数据结构》第八周学习总结

教材学习内容总结

《Java软件结构与数据结构》第十二章-优先队列与栈

一、堆

  • ①堆是一颗具有两个附加属性的完全二叉树
    • 附加属性:1.堆是一颗完全树。2.对于每个结点,它小于或等于其左孩子和右孩子。
  • ②堆默认为最小堆,当然也有最大堆。
  • 图堆12
操作 说明
addElement 将给定元素添加到该堆中
removeMin 删除堆的最小元素
findMin 返回一个指向堆中最小元素的引用
public interface HeapADT<T> extends BinaryTreeADT<T> 
{
   /** 
    * Adds the specified object to this heap. 
    *
    * @param obj the element to be added to the heap
    */   
   public void addElement(T obj);
   
   /** 
    * Removes element with the lowest value from this heap. 
    *
    * @return the element with the lowest value from the heap
    */
   public T removeMin();
   
   /** 
    * Returns a reference to the element with the lowest value in 
    * this heap. 
    *
    * @return a reference to the element with the lowest value in the heap
    */
   public T findMin();
}
  • ③addeEement方法:
    • 该方法将Conparable元素添加到栈的恰当位置,维持该堆的完全性属性与有序属性。
    • 插入的新节点只有一个正确的位置,即最后一层的左边下一个位置,要么是最后一层再加一层左边的第1个位置。插入点一般是最后一片叶子的结点。
    • 实现:

public void add(T newEntry) {
        lastIndex++;
        if(lastIndex >= heap.length)
            doubleArray();
        int newIndex = lastIndex;
        int parentIndex = newIndex / 2;
        heap[0] = newEntry;
        while(newEntry.compareTo(heap[parentIndex]) > 0){
            heap[newIndex] = heap[parentIndex];
            newIndex = parentIndex;
            parentIndex = newIndex / 2;
        }
        heap[newIndex] = newEntry;
    }
  • ④RemoveMin方法
    • 在最小堆里面,最小的元素是堆的根,我们需要删除并且返回它的话,需要一个新的根,通常这个新根是最末的一个叶节点。
    • 由于通常新根变为根节点后堆就不成立了,需要对其进行平衡。
  • ⑤findMin方法
    • 最小堆的根就是最小元素,直接返回根即可。
    • 代码实现
public T findMin() throws EmptyCollectionException
    {
        if (isEmpty())
            throw new EmptyCollectionException("ArrayBinaryTree");

        return tree[0];
    }

二、用链表实现堆

  • ①由于在插入元素后,要进行排序,所以堆中的结点需要拥有指向父辈的指针。
  • ②实现过程中依旧是addElement、removeMin、findMin三种方法,且书上已经有了代码就不多赘述。
  • ③但是需要注意的是在addelement中使用了两个私有方法,一个是getNextParentAdd的方法,它用于返回指向一个结点的引用,一般适用于每个结点指向父辈的。另外一个方法是heapifyAdd这个添加后的排序。
  • ④相对的删除过程中也有两个私有方法,一个为追踪最后一个叶子的方法,一个则是用于对删除后的堆进行排序。

三、用数组实现堆

  • ①数组的实现堆的方法比链表更加简洁。因为链表需要随时追踪父辈结点和最后一个叶子结点,但是数组不同,数组的最后一位就一定会是叶子结点。
  • ②虽然在addelemnt中没有了追踪父辈的方法,但是作为数组,它的容量是恒定的,一旦出现添加的情况,就需要考虑扩容,所以依旧是两个方法,一个扩容,一个用来重排序。
  • ③链表与数组的添加方法的复杂度相同,与此相对的是的删除方法的复杂度也是相同的。

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

  • 问题1:堆是否和红黑树一样,一旦进行添加删除就需要进行平衡?
  • 回答1:堆添加删除元素可能符合原本的堆的性质,可以不进行重排序就可以实现堆。
  • 问题2:为什么说最小堆实现了高效的优先级队列?
  • 回答2:由于队列的性质既是先进先出,我们只需要对Conparable定义为先对于优先级进行比较即可实现优先级队列。

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

  • 本次书上PP问题主要在书上已经是基本实现了的,所以这周的代码问题主要是出现在本次实验过程中。
  • 第二次实验博客

代码托管

-图代码

上周考试错题总结

结对及互评

基于评分标准,我给李楠的博客打分:7分。得分情况如下:

正确使用Markdown语法(加1分)

模板中的要素齐全(加1分)

教材学习中的问题和解决过程, (加3分)

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

感想,体会真切的(加1分)

点评认真,能指出博客和代码中的问题的(加1分)

点评过的同学博客和代码

  • 本周结对学习情况

其他(感悟、思考等,可选)

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 0/0 1/2 10/20
第三周 1500/1500 1/3 10/30
第四周 2761/4261 2/5 25/55
第五周 814/5075 1/6 15/70
第六周 1091/6166 1/7 15/85
第七周 1118/7284 1/8 15/100
第八周 1235/8519 2/10 15/115

猜你喜欢

转载自www.cnblogs.com/yanyujun527/p/9938490.html