# 20172333 2018-2019-1 《程序设计与数据结构》第八周学习总结
Posted yanyujun527
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# 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分)
点评过的同学博客和代码
- 本周结对学习情况
- 20172330李楠
- 结对照片
- 结对学习内容
- 堆
其他(感悟、思考等,可选)
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 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 |
以上是关于# 20172333 2018-2019-1 《程序设计与数据结构》第八周学习总结的主要内容,如果未能解决你的问题,请参考以下文章
20172333 2018-2019-1 《程序设计与数据结构》第五周学习总结
# 20172333 2018-2019-1 《程序设计与数据结构》第八周学习总结
20172333 2018-2019-1 《程序设计与数据结构》第七周学习总结
20172333 2017-2018-2 《程序设计与数据结构》实验5报告