2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结
2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结
现在对于我而言,最珍贵的是时间,感觉自己在时间飞逝的时候真的挽留不住什么,只能怒发冲冠的让自己疯狂的学习啦,新的一周要加油!❤️
教材学习内容总结
《Java软件结构与数据结构》第十二章-优先队列与堆
一、概述
- 1、什么是堆:
- 堆就是具有两个附加属性的一个二叉树。
- 堆分为小顶堆和大顶堆。
- 两个附加属性如下:
- (1)它是一颗完全树。(完全树:如果某树是平衡的,且底层所有叶子都位于树的左边,则认为该树是完全的。
- (2)对每个结点,它(小于/大于)或等于其左孩子和右孩子。(ps:小于为小顶堆,大于为大顶堆)
- 小顶堆将其最小元素存储在该二叉树的根处,且其根的两个孩子同样也是小顶堆。
- 2、堆的操作简历:
| 操作 | 描述 |
|---|---|
| addElement | 将给定元素添加到该堆中 |
| removeMin/removeMax | 删除堆的最小元素/最大元素 |
| findMin/findMax | 返回一个指向堆中的最小元素/最大元素的引用 |
3、堆的具体操作
addElement操作:
- (1)该方法将给定的元素添加到堆中的恰当位置处,且维持该队的完全性属性和有序属性。
- (2)因为一个堆就是一颗完全树,所以对于插入的新结点而言,只存在一个正确的位置,且要么是h层左边下层的下一个空位置,要么是h+1层左边的第1个位置(如果h层是满的话)
如图


插入的调整过程:
如图

removeMin操作:
- (1)该方法将删除最小堆中的最小元素并返回它。
- (2)由于最小元素是存储在最小堆的根处,所以我们需要返回存储在根处的元素并用堆中的另一个元素替换它。
- (3)要维持该树的完全性,那么只有一个能替换根的合法元素,且它是存储在树中最末一片叶子上的元素。
如图

findMin操作
- (1)该方法将返回一个指向该最小堆中最小元素的引用。
- (2)由于该元素总是被存储在该树的根处,所以实现这一方法只需通过返回存储在根处的元素即可。
4、优先队列是什么
优先队列是允许至少下列两种操作的数据结构
- (1)insert(插入),它的作用是显而易见的;
- (2)deleteMin(删除最小者),它的工作是找出、返回并删除优先队列中最小的元素。
insert等价于enqueue(入队),而deleteMin则是队列运算中dequeue(出队)在优先队列中的等价操作。
如图

1、优先队列具有更高的优先级的项目在先。
2、具有相同优先级的项目使用先进先出来确定其排序。
3、虽然小顶堆根本不是一个队列,但是它提供了一个高效的优先级队列实现。
4、优先队列没有back()操作!!!!!
二、用链表实现堆
1、addElement操作
- 过程:
- (1)在恰当的位置处添加一个新元素,对堆进行重排序以维持其排序属性。
- (2)将lastnode指针重新设定为指向新的最末结点。
- 过程:
2、removeMin操作
- 过程:
- (1)用存储在最末结点处的元素替换存储在根处的元素,对堆进行重排序,以及返回初始的根元素。
- (2)链表实现的removeMin方法必须删除根元素,并用来自最末结点替换它。
- (3)该操作的最后的时间复杂度为O(log n)
- 过程:
3、 findMin操作
- 过程:
- (1)该方法仅仅返回一个指向存储在堆根元素的引用,因此复杂度为O(1)。
- 过程:
三、用数组实现堆
1、概念点
- 注:在二叉树的数组实现中,树的根位于位置0处,对于每一结点n,n的左孩子将位于数组2n+1位置处,n的右孩子将位于数组的2(n+1)位置处。
2、addElement操作
- 注:链表实现和数组实现的addElement方法的时间复杂度同为O(log n)
3、removeMin操作
- 注:链表实现和数组实现的removeMin方法的时间复杂度同为O(log n)
4、 findMin操作
- 注:该方法仅仅返回一个指向存储在堆根元素的引用,因此复杂度为O(1)。
四、其他
- 1、heapSort方法的两部分构成:
- (1)添加列表的每一个元素
- (2)一次删除一个元素
- 2、堆排序的复杂度为O(n log n)
教材学习中的问题和解决过程
问题1:在堆的删除和插入操作后进行调整的时候,如何去判断哪一个元素需要被交换
问题1解决方案:
(1)现在的任务是将一个不符合大小顶堆的堆让它变得符合标准。
(2)我们要进行筛选操作:
- 1、调整过程中,总是将根结点(被调整结点)与左右孩子比较
- 2、不满足堆条件时,将根结点与左右孩子中较大者交换
- 3、这个调整过程一直进行到所有子树都是堆或者交换到叶子为止
问题2:堆排序是如何进行的
问题2解决方案:
步骤:
- (1)将关键字序列排成完全二叉树形式;
- (2)从无序序列的第n/2个元素开始(对应于完全二叉树的最后一个非终端结点)进行筛选(筛选可以参考问题1解决方案)
图示:

代码调试中的问题和解决过程
问题1:在进行测试的时候,在输出的时候会出现删除以后多一个元素的现象

问题1解决方案:
(1)首先,我先测试了问题到底出现在哪里,通过调用删除方法,我发现总有一个现象就是会让最后一个元素给替代第一个的位置,所以我就锁定了一行代码tree[0] = tree[count-1];也大致确定了问题也应该源于此,所以需要修改。
(2)我运用之前用数组实现队列的思想,用了如下的方法解决问题。
(3)同时这个问题也可以解决发生在pp12.1在写队列的出列的操作中所发生的问题。
for (int i =0;i<count-1;i++){
tree[i]=tree[i+1];
}
上周考试错题总结
错题1:
The Java Collections API provides two implementations of balanced binary search trees, TreeSet and TreeMap, both of which use a ___________tree implementation.
A .AVL
B .red/black
C .binary search
D .None of the above正确答案: B 我的答案: C
解析:当时我认为既然接口是查找树,则这两个也应该是查找树的方法。
错题2:
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 你的答案: A
解析:眼瞎看错题目了,顶应该是最小
代码托管

结对及互评
- 本周结对学习情况
- 博客中值得学习的或问题:
- 内容详略得当;
- 代码调试环节比较详细;
- 基于评分标准,我给本博客打分:5分。得分情况如下:
正确使用Markdown语法(加1分):
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
- 博客中值得学习的或问题:
- 内容详略得当;
- 代码调试环节比较详细;
- 基于评分标准,我给本博客打分:9分。得分情况如下:
- 正确使用Markdown语法(加1分):
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 一个问题加1分
- 代码调试中的问题和解决过程, 一个问题加1分
感悟
本周觉得自己愈发忙碌了起来,感觉时间真的越来越不够用了,和老师也聊了聊,的确上大学上成这个样子可能也是haiok,老师说现在上大学累成够=狗说明就对了,我觉得的确,像在大学这样一个时间由自己支配的阶段,我觉得只要自己有心,肯定就可以找到更多的事情自己去做,因为正因为有大学这个平台,让我们可以学习到更多有利于自己今后发展技能,让自己将来可以在社会中有立足之地。
学习进度条
| 代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
|---|---|---|---|
| 目标 | 5000行 | 30篇 | 400小时 |
| 第一周 | 0/0 | 1/1 | 6/6 |
| 第二周 | 1313/1313 | 1/2 | 20/26 |
| 第三周 | 901/2214 | 1/3 | 20/46 |
| 第四周 | 3635/5849 | 2/4 | 20/66 |
| 第五周 | 1525/7374 | 1/5 | 20/86 |
| 第六周 | 1542/8869 | 2/5 | 25/111 |
| 第七周 | 1391/10260 | 1/6 | 20/131 |
| 第八周 | 4379/14639 | 2/8 | 25/156 |
参考资料
2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结的更多相关文章
- 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结
20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- 20172329 2018-2019《Java软件结构与数据结构》第一周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...
- 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结
20172328 2018-2019<Java软件结构与数据结构>第一周学习总结 概述 Generalization 本周学习了软件质量.数据结构以及算法分析的具体内容,主要依托于所用教材 ...
- 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结
20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...
- 《JAVA软件结构与数据结构》第一周学习总结
学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第二周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...
随机推荐
- 电商 APP 下单页(俗称车2) 业务流程概要设计
购物车是电商APP的一个关键功能点,一般购物车包含 3-4 个页面,分别是: 1.购物车的商品列表页 2.商品下单页 3.订单付款页面 4.订单付款成功页面 由于现有购物车逻辑相对混乱,这里重新整理一 ...
- SEO优化上首页之搜索引擎原理内容处理与索引
上文<搜索引擎原理SEO优化上首页之蜘蛛Spider>详细介绍了蜘蛛的分类.抓取入口.抓取策略和更新策略.搜索引擎已把页面抓取回来,接下来是解析页面内容,主要包含判断页面类型.提取页面主题 ...
- Linux环境下的多线程
1. 按照POSIX 1003.1c 标准编写的程序与Linuxthread 库相链接即可支持Linux平台上的多线程,在程序中需包含头文件pthread. h,在编译链接时使用命令: gcc -D ...
- GATK--数据预处理,质控,检测变异
版权声明:本文源自 解螺旋的矿工, 由 XP 整理发表,共 13781 字. 转载请注明:从零开始完整学习全基因组测序(WGS)数据分析:第4节 构建WGS主流程 | Public Library o ...
- 4569: [Scoi2016]萌萌哒
4569: [Scoi2016]萌萌哒 链接 分析: 每次给出的两个区间长度是一样的,对应位置的数字也是一样的,那么可以将两两对应的数字用并查集合并,设最后有$cnt$个不同的集合,答案就是$9\ti ...
- Codeforces 912 E.Prime Gift (折半枚举、二分)
题目链接:Prime Gift 题意: 给出了n(1<=n<=16)个互不相同的质数pi(2<=pi<=100),现在要求第k大个约数全在所给质数集的数.(保证这个数不超过1e ...
- mtr语言真是逆天了
实践证明,设计一个语言,还不是简单的解释没一行哦
- (转)js数组与字符串的相互转换方法
一.数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: var a, b; a = new Array(0,1,2,3,4); b = a.join("-"); 二 ...
- selenium select 选择下拉框
实战百度首页设置,浏览偏好设置. 打开首页,在非登录的情况下,查看分析页面元素,我们可以看到,我们首先要点击的是设置, 接着点击,搜索设置, 然后select选择下拉框. select_by_inde ...
- hdu1754 I Hate It(线段树单点更新,区间查询)
传送门 有更新单个学生成绩和查询某个区间内学生成绩最大值两种操作 线段树代码 #include<bits/stdc++.h> using namespace std; +; using n ...