标签:pos 要求 体会 element contain 链表 ima 资料 等于
堆
1.最小堆(minheap):对是一个完全二叉树,其中的每个结点都小于或等于它的两个孩子。
2.最大堆(maxheap):对是一个完全二叉树,其中的每个结点都大于或等于它的两个孩子。
3.最小堆将其最小的元素储存在该二叉树的根处,且其根的两个孩子也同样是最小堆
4.addElement操作
将元素添加为新的叶结点,同时保持树是完全树,将该元素向根的地方移动,将它与父结点对换,直到其中的元素大小关系满足要求为止。
5.removeMin操作
利用最后的叶结点来取代根,然后将其向下移动到合适的位置。
6.findMin操作
此操作较简单,因为在添加元素的过程中就已经把最小元素移动到了根位置。
7.堆和二叉排序树的区别:
堆的实现(以最大堆为例)
1.最大堆接口的实现:
public interface MaxHeap<T extends Comparable<T>> extends BinaryTree<T>
{
// Adds the specified object to the heap.
public void add (T obj);
// Returns a reference to the element with the highest value in the heap.
public T getMax ();
// Removes and returns the element with the highest value in the heap.
public T removeMax ();
}
2.在 LinkedMaxHeap 中的 add 方法依赖于HeapNode中的两个方法:getParentAdd 和 heapifyAdd 方法。
其中 getParentAdd 方法从树的最后一个结点开始,一个一个检测,寻找新加入结点的父结点。从树中开始向上查找,直到发现它是某个结点的左子结点,或是到达根结点时为止。如果到达根结点,新的父结点是根的左后继结点。如果没有到达根结点,则再查找右子结点的最左后继。删除的成本。
public HeapNode<T> getParentAdd (HeapNode<T> last)
{
HeapNode<T> result = last;
while ((result.parent != null) && (result.parent.left != result))
result = result.parent;
if (result.parent != null)
if (result.parent.right == null)
result = result.parent;
else
{
result = (HeapNode<T>) result.parent.right;
while (result.left != null)
result = (HeapNode<T>) result.left;
}
else
while (result.left != null)
result = (HeapNode<T>) result.left;
return result;
}
一旦新的叶结点添加到树中,heapifyAdd 方法就利用 parent 引用沿树向上移动,必要时交换元素。(交换的是元素,不是结点)
public void heapifyAdd (HeapNode<T> last)
{
T temp;
HeapNode<T> current = last;
while ((current.parent != null) &&
((current.element).compareTo(current.parent.element) > 0))
{
temp = current.element;
current.element = current.parent.element;
current.parent.element = temp;
current = current.parent;
}
}
堆排序
1.思路:将一组元素一项项地插入到堆中,然后一次删除一个。因为最大元素最先从堆中删除,所以一次次删除得到的元素将是有序序列,而且是降序的。同理,一个最小堆可用来得到升序的排序结果。
优先队列
1.两个规则:
1.具有更高优先级的项排在前.(不是FIFO)
2.具有相同优先级的项目按先进先出的规则排列。(FIFO)
2.实现方法:定义结点类保存队列中的元素、优先级和排列次序。然后,通过实现 Comparable 接口定义 compareTo 方法,先比较优先级,再比较排列次序。
从最后一个非叶子结点开始(叶结点不用调整,第一个非叶子结点 arr.length/2-1=5/2-1=1,也就是下面的6结点),从左至右,从下至上进行调整:
找到第二歌非页结点4,由于[4、9、8]中9最大,4和9交换/
这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,5,6]中6最大,交换4和6。
这样大顶堆就完成了。
【步骤二】将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。首先将堆顶元素9和末尾元素4进行交换:
重新调整结构,使其继续满足堆定义:
再将堆顶元素8与末尾元素5进行交换,得到第二大元素8:
【步骤三】如此反复进行交换、重建、交换。反复进行此过程,便可得到有序序列:
所以,基本步骤概括为:将无序堆构建成大顶堆或小顶堆,再通过反复交换堆顶元素和当前末尾元素并调整,最后使整个序列有序。
暂无
分析:在从二叉查找树中删除元素时, 另一个节点必须促进以替换要删除的节点。
分析:二叉查找树中最左边的节点将包含最小元素, 而最右边的节点将包含最大元素。
分析:树的用途之一是提供其他集合的高效的实现。
分析:同错题2。
分析:同错题3.
分析:compareTo返回的是-1,0,1。所以为int值
分析:气泡和插入排序都具有 o (n) 的时间复杂度,但选择排序最好情况为O(n^2)。
分析:插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, (加3分)
代码调试中的问题和解决过程, 无问题
感想,体会真切的(加1分)
点评认真,能指出博客和代码中的问题的(加1分)
20172320
基于评分标准,我给以上博客打分:8分。得分情况如下:
堆基于以前的所实现的,代码需要补充的不多,所以还好学。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 8/8 | |
第二周 | 1306/1306 | 1/2 | 20/28 | |
第三周 | 1291/2597 | 1/3 | 18/46 | |
第四周 | 4361/6958 | 2/3 | 20/66 | |
第五周 | 1755/8713 | 1/6 | 20/86 | |
第六周 | 3349/12062 | 1/7 | 20/106 | |
第七周 | 3308/15370 | 1/8 | 20/126 | |
第八周 | 4206/19576 | 2/10 | 20/146 |
计划学习时间:10小时
实际学习时间:8小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
20172327 2018-2019-1 《程序设计与数据结构》第八周学习总结
标签:pos 要求 体会 element contain 链表 ima 资料 等于
原文地址:https://www.cnblogs.com/mrf1209/p/9940248.html