小于或等于其左孩子和右孩子的是最小堆(minheap),结点大于或等于它的左右孩子是最大堆(maxheap), 其中的结点大于或等于它的左右孩子。关键概念html
最小堆将其最小元素存储在该二叉树的根处,且其根的两个孩子一样也是最小堆。
java
堆的接口:git
蓝墨云上作的一个练习就很清楚地显示了这个过程。
算法
问题1:课本屡次说到完成一些操做例如:addElement和removeMin等操做,数组和链表实现的堆的复杂度是相同的,可是仍是说数组实现的效率更高,这是为何?数组和链表实现堆的优缺点分别是什么?数组
问题1解决方案:
用数组实现堆时,进行addElement操做不须要和链表同样从新肯定新节点双亲,removemin操做不须要肯定新的最末结点。数据结构
简单总结一下,用数组实现堆的好处有学习
优势:和顺序存储同样的
一、能够很方便找到孩子、双亲和兄弟,以及祖先和子孙
二、只须要存储数据元素,不须要另外存储元素的逻辑关系
三、物理结构和逻辑结构一致测试
private HeapNode<T> 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; }
而后就去问馨雨同窗,这些代码的意思,结果讨论讨论着,馨雨馨雨就被我问蒙了,O(∩_∩)O,后来,发现是咱们理解错了lastNode结点,“插入结点的双亲结点”,以前一直理解的是将要插入的结点的双亲结点,其实lastNode是最后一片叶子结点,状况以下:
设计
ArrayHeap类的代码书上是有给出的,而后本身写了一个测试类,结果发现出现了这样的问题3d
而后又仔细思考了一下代码,在代码中将最后一个元素赋值给了root结点,可是缘由是并无将叶结点删除,因此接下来从新调平衡的时候,最后的那个位置并进行操做,因此出现了重复。
(statistics.sh脚本的运行结果截图)
错题1及缘由,理解状况
What type does "compareTo" return?
A
.
int
B
.
String
C
.
boolean
D
.
char
解析:compareTo()方法确实是String类中的一个,可是compareTo()的返回值是int。
它先比较对应字符的ASCII码,如字符串的某字符与参数的某字符不等,则结束比较,返回它们ASCII码的差值。直至字符串的字符或参数的字符 有一方全比较完,此时比较字符串的长度差并返回。
这周又是Java课多到爆表的双周,咱们又开始完成实验二了,并且这周老师还让咱们组了个队,要完成一个Java项目的开发,ε=ε=ε=(#>д<)ノ,难。
这个学期愈来愈注重代码的编写能力,也接触到了不少的新的算法和知识点,就像这个礼拜学的堆,但愿本身接下来的课程要继续努力。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | ||
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 326/326 | 1/2 | 18/28 | |
第三周 | 784/1110 | 1/3 | 25/53 | |
第四周 | 2529/3638 | 2/5 | 37/90 | |
第五周 | 1254/4892 | 2/7 | 20/110 | |
第六周 | 1403/6295 | 2/9 | 32/142 | |
第七周 | 1361/7656 | 1/10 | 35/177 | |
第八周 | 2750/10406 | 2/12 | 32/209 |
计划学习时间:30小时
实际学习时间:32小时
改进状况:这周是双周,Java课比较多,课程内容也比较多,保持了良好的学习进度和时间。