标签:else tle 学习总结 htm 最大 class insert 引用 amp
本周学习了第12章优先队列与堆
操作 说明 addElement 将给定元素添加到该堆中 removeMin 删除堆的最小元素 findMin 返回一个指向堆中最小元素的引用
如图是一个最小堆
addElement方法将给定的Comparable元素添加到堆中的恰当位置处,且维持该堆的完全性属性和有序性属性
如果一棵二叉树是平衡的,及所有叶子都位于h或者h-1层,其中h为log2n,n是树中的元素数目,以及所有h层中的叶子都位于该树的左边,那么该树就被认为是完全的。因为堆是一棵完全树,所以对于新插入的结点只存在一个正确的位置,要么是h层左边的下一个空位置,要么就是h+1层左边的第一个位置(如果h层是满的话)
removeMin操作将删除最小堆中的最小元素并返回他,最小堆中的元素即是它的根结点,为了保持树的合法性,需要有一个能替换根的合法元素,且它是树中最末一片叶子上的元素。将最末一片叶子移至根处之后,又需要将该堆进行重新排序。排序方法需要将该结点与最小孩子进行比较然后逐渐下沉到合适的位置。借用上图,如果将根结点1删去,那么最末叶子6就将成为新的根结点,它将与2、5进行比较最终落在5现在的位置,而2将成为新的根结点。
问题1:链表实现堆的过程中的addElement操作第一步要确定要插入结点的双亲,为什么在最坏的情况下要从堆的右下结点遍历到根结点之后还要再从根结点遍历到堆的左下结点?
问题1解决方案:这个问题我思考了小半个小时,添加的第一步需要确定插入结点的双亲,因为需要比较双亲结点的值与新结点的值,决定新结点是否要上浮。所以最坏的情况应该是新结点一直上浮到根结点,此时按最小堆的定义来看,添加元素这一操作应该是停止了,因为堆顶是最小元素了,它的左孩子和右孩子的值都应该比它要小,所以不需要继续遍历它的左孩子直到左下结点了吧。和同学讨论之后,才发现我的理解错在哪里了。它这里指的是遍历的最坏情况需要从右下结点一直到根再到左下结点,而不是结点互相之间的比较需要让结点上浮之后再次下沉(事实上跟我分析的一样,他也无法做到)。它这里指的是查找确定新结点的双亲结点的最坏情况
如上丑图,添加元素时刚好遇见满树的情况,需要从右下最后一片叶子开始找起,一直到左下结点,才最终确定要插入的元素的双亲结点。
getNextParentAdd
方法的理解 HeapNode<T> result = lastNode;
while ((result != root) && (result.getParent().getLeft() != result))
result = result.getParent();
if (result != root)
if (result.getParent().getRight() == null)
result = result.getParent();
else {
result = (HeapNode<T>) result.getParent().getRight();
while (result.getLeft() != null)
result = (HeapNode<T>) result.getLeft();
}
else
while (result.getLeft() != null)
result = (HeapNode<T>) result.getLeft();
return result;
首先教材讲到,这是一个返回指向插入结点的双亲结点的引用。所以就容易理解到,这个方法就是确定新插入结点的双亲结点。也就通过此来决定新添加元素的位置。
一开始,新设一个变量result指向lastNode,即指向最后一片叶子的引用。
接下来通过判断最后一片叶子的情况来确定插入结点的双亲结点,当最后一片叶子不是根结点且同时不是左孩子的时候,就将result的父结点付给result,直到不满足两个条件之一跳出循环。当最后一片叶子是根结点时,已经确定了新结点的双亲结点,可以进入下一步,而如果最后一片叶子是右结点,就说明当前父结点是满的,不能再在当前父结点下添加新元素,所以将result指向result的父亲,方便寻找一个没有满的父结点。下一步,此时result跳出while循环,要么它是根结点,要么它是左孩子。如果它是左孩子,即进入if语句内,判断它的兄弟结点是否为null,如果返回true,那么新添加元素的双亲结点就确定了是result的父结点,而新结点将作为result的右孩子添加到堆中,如果返回false,result将指向这个右孩子,并找到它的最左下的位置添加。如果result是指向根结点的,那么也一直循环到它的最左下位置,添加新元素。
这个问题的解决参考了于欣月同学的博客,她在解释时运用了图文结合的形式,对我理解该问题起了很大帮助
问题1:测试LinkedHeap类,实现层序输出、前序中序后序各种输出,很不巧的是它出现了乱码的情况
问题1解决方案:这个问题的出现充分说明我还没能掌握迭代器的精髓,首先方法的使用就是完全错误的,我还把它当作简单的toString方法在加以使用。所以自然输出不来需要的结果,标准的应该是如图,先设置一个迭代器的对象,通过for循环一个一个调用迭代器里的内容,如图
排序方法 时间复杂度 选择排序 O(n^2) 插入排序 O(n^2) 冒泡排序 O(n^2)
基于评分标准,我给谭鑫的博客打分:8分。得分情况如下:
正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, 三个问题加3分
代码调试中的问题和解决过程, 三个问题加3分
基于评分标准,我给方艺雯的博客打分:8分。得分情况如下
正确使用Markdown语法(加1分):
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, 两个问题加2分
代码调试中的问题和解决过程, 四个问题加4分
这周的教材学习比较容易,所以花的时间相对较少,但是实验令人难受。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 8/8 | |
第二周 | 470/470 | 1/2 | 12/20 | |
第三周 | 685/1155 | 2/4 | 10/30 | |
第四周 | 2499/3654 | 2/6 | 12/42 | |
第六周 | 1218/4872 | 2/8 | 10/52 | |
第七周 | 590/5462 | 1/9 | 12/64 | |
第八周 | 993/6455 | 1/10 | 12/76 | |
第九周 | 1192/7467 | 2/12 | 10/86 |
20172323 2018-2019-1 《程序设计与数据结构》第八周学习总结
标签:else tle 学习总结 htm 最大 class insert 引用 amp
原文地址:https://www.cnblogs.com/Lewandodoski/p/9939739.html