20182333 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结
20182333 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结
教材学习内容总结
查找
- 1.查找:是一个过程,即在某个项目组中寻找某一项指定目标元素,或者确定该指定目标并不存在。
- 2.静态方法:也称为类方法,可以通过类名来调用,无需实例化该类的对象。 在方法声明中,通过使用static修饰符就可以把他声明为静态的。
- 3.泛型方法:要创建一个泛型方法,只需要在方法头的返回类型前插入一个泛型声明即可,其格式是:修饰符 <类型参数列表> 返回类型 方法名(形参列表) { 方法体 }。例如:
public static <T, S> int func(List list, Map<Integer, S> map) { ... }
- 4.线性查找法:即从列表头开始依次比较每一个值,直至找到该目标元素或到列表尾未找到,这是一种最简单的查找方式,但它的效率并不是高效的。
- 5.二分查找法:是在有序数组中用到的较为频繁的一种算法,就是不断将数组进行对半分割,每次拿中间元素和目标进行比较。
- 6.分块查找:是折半查找和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。分块查找要求把一个大的线性表分解成若干块,每块中的节点可以任意存放,但块与块之间必须排序。
- 7.分块查找步骤:①先选取各块中的最大关键字构成一个索引表;②查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。
排序
- 1.排序:是一个过程,基于某一标准或升序或降序按某个规定的顺序排列。
- 2.排序算法:①顺序排序。②对数排序。与查找算法一样,在n较小时两类算法间的差别较小。
- 3.顺序排序:①选择排序法。②插入排序法。③冒泡排序法。
- 4.对数排序:①快速排序法。②归并排序法。
- 5.选择排序法:扫描整个列表找出最小值,将这个值与该列表第一处交换,再扫描剩下的列表找出最小值,将它与整个列表的第二处交换,以此类推。(代码需要用一个temp变量暂时存储最小值)
- 6.插入排序法:通过反复地将某一特定值插入到该列表某个已排序的子集中来完成对列表值的排序。也就是先比较第一个数和第二个数,把第一个数和第二个数排好序之后,把第三个数与已排好的第一个数和第二个数进行比较然后插入进合适的位置,依此类推排完列表中的所有数。
- 7.冒泡排序法:通过重复比较列表中的相邻元素,并在它们彼此不符顺序时将它们互换来完成对值的排序。也就是先把最大或最小的数放在恰当位置,之后再冒泡出倒数第二个值。
- 8.快速排序法:通过使用一个任意选定的分区元素将该列表分区,然后对分区元素的任一边的子列表进行递归排序。
- 9.归并排序法:通过将列表递归式分成两半直至每一子列表都只含有一个元素,然后将这些子列表按顺序重组。(若是奇数,则分解是后面比前面多一个。)
- 10.基数排序法:基于排序关键字(排序基于某个特定的值)的结构。(就是先创建基数的队列,然后把数放进相应的队列中,通过不断的遍历找到最后的位置)
- 11.基数:排序关键字的可能取值的个数(也就是每种排序关键字都会单独创建一个队列,最后的队列个数)。
教材学习中的问题和解决过程
-
问题1:查找算法的比较
-
问题1解决方案:
1.线性查找可以针对任何数组,将数组中的每项依次遍历出来之后,与所要查找项对比。消耗时间也是不规律的,可能查找项处于数组的第一位,也可能处于数组的最后一位。还有可能数组中完全不存在需要查找的项目。
2.二分查找法,针对有序数组使用。因为数组已经有序排列,可以通过将数组从中间分割,将中间项与所需查找项对比;然后再根据对比结果,再次向上或者向下,寻找中间项对比,直至完成查找。
而且,对于查找最开始,可以通过与第一项和最末项的对比,确定查找项是否处于此数组中。
-
问题2:五种排序的比较
-
问题2解决方案:
-
问题3:快速排序法的具体步骤是什么?到底怎么排序?
-
问题3解决方案:
1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 3.再对左右区间重复第二步,直到各区间只有一个数。
-
问题4:排序算法的稳定性的意义
-
问题4解决方案:
稳定性的定义: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
常见算法的稳定性(要记住) 堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。 稳定性的意义 1、如果只是简单的进行数字的排序,那么稳定性将毫无意义。 2、如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义(所谓的交换操作的开销已经算在算法的开销内了,如果嫌弃这种开销,不如换算法好了?) 3、如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。 4、除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法,例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得想同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。(当然,如果需求不需要保持初始的排序意义,那么使用稳定性算法依旧将毫无意义)。
代码调试中的问题和解决过程
- 问题1:==,equals和compareTo的区别?
- 问题1解决方案:
"equals": 比较的是两个字符串中的每个字符是否相同,例如:a="1243", b="1243",那么a.equals(b)就会返回TRUE,因为a和b两个字符串中的每一个字 符都相同,如果对a或者b中的任何一个做任何修改,equals()就会返回false。 ”==":比较的是两个字符串是否同时引用的一个地址,如果 a=new String("abc");b=a;b引用的a, 所以a == b的比较就会返回TRUE。 compareTo(): 这个函数的作用就是对两个字符串按字典排序的方式进行比较,返回两个字符串中第一个不同的字符的ascII码差值。
- 问题2:给数组赋值时发现
int
和integer
并不一样 - 问题2解决方案:
Integer 是 int 包装类,int 是八大基本数据类型之一 Integer 是类,默认值为null,int是基本数据类型,默认值为0; Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值。
代码托管
上周考试错题总结
上周没有考试,所以没有错题。
点评过的同学博客和代码
其他(感悟、思考等,可选)
本周主要学习了查找和排序。虽然这么说感觉很少,但是学的东西却一点都不少,查找和排序每个都有五六种反法要去学习,而且还要去理解每一种反法的思维模式。反正这一周很难!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 56/56 | 2/2 | 20/20 | 主要学会了简单的操作Linux以及如何编写简单的java程序并将它上传到码云 |
第二、三周 | 331/407 | 3/5 | 23/43 | 学会了一些类和程序包的使用,也明白了C语言和Java在有些地方的区别 |
第四周 | 595/1002 | 2/7 | 20/60 | 学会了IDEA以及用IDEAgit码云,也学会了TDD测试 |
第五周 | 1621/2623 | 2/9 | 17/77 | 见识了服务器与用户链接的代码,也学习了继承的一些知识。 |
第六周 | 1770/4393 | 1/10 | 22/99 | 学习了多态以及与接口和继承的关系,还有就是对异常的学习和处理异常的方法以及自定义一个异常 |
第七周 | 1747/6140 | 3/13 | 23/122 | 学习了渐进复杂度的计算,栈和队列的学习,分别用数组和链表实现队列 |
第八周 | 384/6524 | 1/14 | 20/142 | 学习了一些查找和排序的算法,也学会了计算ASL |
-
计划学习时间:20小时
-
实际学习时间:20小时
-
改进情况:无