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程序设计》第八周学习总结
原文:https://www.cnblogs.com/garolwz/p/9925570.html