本周学习了二叉树的另外一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍)ノ゙就是堆。本章将讲解堆的链表实现and数组实现,以及往堆中添加元素或从堆中删除元素的算法;还将介绍对的一些用途,包括基本使用和优先队列。 |
堆中的操做:
html
addElement方法将给定的Comparable元素添加到堆的恰当位置处,且维持该堆的彻底性属性和有序属性。java
- Little Tip:彻底树你还记得吗?彻底二叉树就是全部叶子都位于h或者h-1层,其中h为log2(n),且n为树中的元素数目,h层的全部叶子都位于该树的左边,那么该树被认为是彻底的。
其次,具备相同优先级的项目使用先进先出方法来肯定其排序。node
public HeapNode lastNode;
总结:链表实现和数组实现的addElement方法和removeElement方法时间复杂度都是O(logn)。可是,数组的实现仍是更高效一些,由于在addElement操做中数组实现不用去肯定插入双亲的结点,在removeElement操做中数组实现不须要肯定新的最末一片叶子。git
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; }
这段代码是返回将要插入结点的双亲结点的方法,当时我和仇夏讨论的是有两种状况。由于咱们知道插入操做为了保证树的彻底性,因此要在h层的从左开始数的第一个空结点插入或者在h+1层的最左边插入(若是树是满的话),可是在循环体中不知足咱们的要求。程序员
问题的重点是“下一个将要插入结点的双亲结点”,以前一直理解的是新插入结点的双亲结点,因此固然不对。在理解正确以后,画出几种插入的可能状况,再跟着上述代码理解几遍,就慢慢清晰明朗了。
算法
int a = 3
; long b = 255L
;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并无类的存在。如int a = 3
; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,因为大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的缘由,就存在于栈中。首先,我先用链表实现的堆来实现队列。经过在enqueue方法中调用addElement方法,就可以实现队列的入队,可是在入队后进行了堆的插入中的排序?队列是符合先进先出原则的,那么我就修改了堆中的插入方法,将其中的排序删掉。同理,当出队时也不该该去考虑排序的问题。可是当我删除掉删除的排序后,再执行删除队列中前两个元素,我却发现删除的并不必定是队列的前两个值,反而删除掉了最开始跟的值和最末一个叶子,这是由堆的性质决定的。因此想要保持先进先出,咱们就要找到堆顶的左孩子而后删除。因此咱们须要改变一下堆中的排序方法。链表的实现方法很麻烦,并且要改变删除的排序算法须要考虑不少种状况,在作了两小时仍是不能完整正确的状况下,让咱们把目光投向数组。
spring
数组中只须要将删除后的最末结点变成null就能够达到效果。
数组
Crossing miles of frustrations and rivers a raging,picking up stones I found along the way.数据结构
怕不轻松,怕过轻松。
不再用以为工做日长,由于天天好像都是工做日。想忙里偷闲就忙里偷闲,想抓紧作事就抓紧作事。ide
我将天天告诉本身:请对专业课程更加虔诚一点。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 0/0 | 1/1 | 8/8 |
第二周 | 621/621 | 1/2 | 12/20 |
第三周 | 678/1299 | 1/3 | 10/30 |
第四周 | 2734/4033 | 1/4 | 20/50 |
第五周 | 1100/5133 | 1/5 | 20/70 |
第六周 | 1574/6707 | 2/7 | 15/85 |
第七周 | 1803/8510 | 1/8 | 20/105 |
第八周 | 2855/11365 | 2/10 | 25/130 |