20172302 《Java软件结构与数据结构》第五周学习总结
2018年学习总结博客总目录:[第一周](https://www.cnblogs.com/hzy0628/p/9606767.html) [第二周](https://www.cnblogs.com/hzy0628/p/9655903.html) [第三周](https://www.cnblogs.com/hzy0628/p/9700082.html) [第四周](https://www.cnblogs.com/hzy0628/p/9737321.html) [第五周](https://www.cnblogs.com/hzy0628/p/9786586.html)
教材学习内容总结
查找
查找即在某项目组中寻找某一指定目标元素,或确定该组中并不存在此元素。对其进行查找的项目组称为查找池。
1.线性查找法,即从列表头开始依次比较每一个值,直至找到该目标元素或到列表尾未找到,这是一种最简单的查找方式,但它的效率并不是高效的。
2.二分查找法一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn)。
3.两种查找方法对比:线性查找要比二分查找简单,易于调试;同时,线性查找无需花费额外成本排序该列表。对于小型问题,这两种算法几乎不存在实用差别,但n变大后,二分查找就会变得很有效率。
排序
排序:基于某一标准,按照某个规定顺序对某一项目组进行顺序排列。基于效率排序算法可分为两类:顺序排序(需要进行n²次比较);对数排序(需要进行nlog(2)n次比较)。
1.选择排序法:在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换;
第二次遍历n-2个数,找到最小的数值与第二个元素交换;
......
第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。

2.插入排序法:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。


3.冒泡排序法:比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
实现代码:
public static <T extends Comparable<T>> void bubbleSort(T[] data)
{
int position, scan;
T temp;
for (position = data.length - 1; position >= 0; position--)
{
for (scan = 0; scan <= position - 1; scan++)
{
if (data[scan].compareTo(data[scan+1]) > 0)
swap(data, scan, scan + 1);
}
}
}
4.快速排序法:先从数列中取出一个数作为key值;
将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;
对左右两个小数列重复第二步,直至各区间只有1个数。

5.归并排序法:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

6.基数排序法:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.

- 各种排序算法效率比较:

基数排序中:r代表关键字的基数,d代表长度,n代表关键字个数
教材学习中的问题和解决过程
问题1:“@SuppressWarnings("unchecked")”是有什么作用?
问题1解决方案:java.lang.SuppressWarnings是J2SE5.0中标准的Annotation之一。可以标注在类、字段、方法、参数、构造方法,以及局部变量上。
作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。
使用:
@SuppressWarnings(“”)
@SuppressWarnings({})
@SuppressWarnings(value={})
书上的这处使用是 @SuppressWarnings("unchecked"),告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。问题2:关于泛型方法使用及其形式。
问题2解决方案:来看一个泛型方法,
public static <T extends CharSequence> T defaultIfBlank(T str, T defaultStr)
{
return isBlank(str) ? defaultStr : str;
}
如上图的泛型方法在方法名称前面有一个声明,它的作用是告诉编译器编译的时候就识别它的类型,如果传入的T是A类型,那么你就不可以将B类型传入方法中去;
- 说明:
1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
- 关于“public static <T extends Comparable<? super T>>”我一开始也不懂,看了郭恺同学博客,非常受益,尤其是关于Java中的通配符的使用和边界讲解很全面。传送门,这里就不再自己总结了。
代码调试中的问题和解决过程
问题1:关于PP9.2,读了两次题目,第一遍没读明白,第二遍读不懂“将i减少某个大于1的数量i并继续该过程直至i小于1”,并且在第一次做完后结果正确,但我感觉做的不对。
问题1解决方案:第一次做的时候是在原冒泡排序算法上进行了修改,就是在其外层又加了一个循环,
while(i>=1){......i-=1},这样做是可以出结果,但是这其中有错误,当循环运行到i=1时,这不就是把冒泡排序又做了一遍,那这和间隔排序有什么联系,后放弃了这种思路。
接下来就读题,然后按照题目要求,一点一点写,两次循环就足够了,修改后代码见下:
public static <T extends Comparable<T>>void gapSort(T[] data,int i)
{
int scan;
while (i>=1)
{
for (scan = 0;scan<=data.length-1-i;scan++)
{
if (data[scan].compareTo(data[scan + i]) > 0)
swap(data, scan, scan + i);
}
i -=2;
}
}
随后,用之前的SortPhoneList类做了测试,结果如下:

问题2:PP9.4,如何来查看代码的运行时间?
问题2解决方案:查找资料,参见: java测试代码段执行时间
按照所给的方法,进行添加,
long a=System.currentTimeMillis();
Sorting.quickSort2(list);
System.out.println("旧版本执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 ");
long b=System.currentTimeMillis();
Sorting.quickSort2(list);
System.out.println("新版本执行耗时 : "+(System.currentTimeMillis()-b)/1000f+" 秒 ");
运行结果见图:

问题3:在记录归并、快速排序法的总比较次数时如何去计算递归函数的调用次数?
问题3解决方案:从网上找方法:
比如一个递归函数:
: double f (double n) {
: if(n <= 10.0)
: ...................
再封一层函数,传个计数器进去
double f(double n, Integer c) {
f(n);
c++;
}

试过之后发现没用,每次都会把这个c初始化,无法进行统计。后继续找,看到了这个,于是试着设置了一个全局变量,便能够记录了。
定义一个全局变量,在递归函数里+1,这样递归的次数就放到全局变量里了
public class $ {
private static int count;
public static void main(String... _) {
test('A', 'B', 'C', 3);
System.out.println("递归次数:" + count);
}
private static void test(char a, char b, char c, int n) {
count++;
if (n == 1) {
move(b, c);
return;
}
test(c, b, a, n - 1);
move(b, c);
test(b, a, c, n - 1);
}
private static void move(char a, char b) {
System.out.println(a + "==>" + b);
}
}
用上面方法结果截图:

代码托管

上周代码行数为10335行,现在为11412行,本周共1077行。
上周考试错题总结
The Java Collections API contains _________ implementations of an indexed list.
A .Two
B .Three
C .Four
D .Five解析:Java集合API中含有索引列表的三种实现。
结对及互评
- 本周结对学习情况
博客中值得学习的或问题: 博客中代码问题解决过程记录较详细,教材内容总结这次也增加了很多内容,博客很充实了。
结对学习内容:第九章——查找与排序,并讨论了间隔排序法。
其他(感悟、思考等)
感悟
- 这周的排序算法的代码有些复杂,排序这里能做的问题也有很多,现在能够基本明白各个算法的意思,代码有些地方理解的还差点。
学习进度条
| 代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
|---|---|---|---|---|
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 0/0 | 1/1 | 15/15 | |
| 第二周 | 572/572 | 1/2 | 16/31 | |
| 第三周 | 612/1184 | 1/3 | 13/44 | |
| 第四周 | 1468/2652 | 2/5 | 13/57 | |
| 第五周 | 1077/3729 | 1/6 | 14/71 | 初步理解各个排序算法 |
参考资料
- 十大编程算法助程序员走上高手之路
- 排序算法总结
- java基数排序
- java测试代码段执行时间
- 常见排序算法及对应的时间复杂度和空间复杂度
- @SuppressWarnings注解
- java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
- java程序中如何统计递归次数
20172302 《Java软件结构与数据结构》第五周学习总结的更多相关文章
- 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: ...
- 2018-2019-20172329 《Java软件结构与数据结构》第二周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...
- 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 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- 《JAVA软件结构与数据结构》第一周学习总结
学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...
随机推荐
- Jenkins与网站代码上线解决方案【转】
转自 Jenkins与网站代码上线解决方案 - 惨绿少年 https://www.nmtui.com/clsn/lx524.html 1.1 前言 Jenkins是一个用Java编写的开源的持续集成工 ...
- shell编程之helloworld
/bin/sh与/bin/bash的区别sh:如果前面有语句报错,则报错语句后面的命令不执行bash:如果前面有语句报错,后面的命令也会执行sh跟bash的区别,实际上就是bash有没有开启posix ...
- eclipse自动编译
自动编译:对java应用没有什么意义,对web应用来说,当修改了代码时,会自动帮你编译并发布到web容器中去,省的重启web容器了. build:编译,Eclipse的编译是基于时间戳的判断机制的.c ...
- plsql developer如何自定义快捷键
首选项 用户界面 编辑器 自动替换 选择替换文件,文件内容: sf=select * from df=delete from
- (并发编程)全局解释器锁(GIL)-----有了GIL不用给线程加锁了?
一.全局解释器锁 (GIL)运行test.py的流程:a.将python解释器的代码从硬盘读入内存b.将test.py的代码从硬盘读入内存 (一个进程内装有两份代码---一份cpython解释器代码 ...
- 配置spring所需要的jar包
spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...
- python 全栈开发,Day135(爬虫系列之第2章-BS和Xpath模块)
一.BeautifulSoup 1. 简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: ''' Beautiful Soup提供一些简单 ...
- webservice restful一个小例子
需求 公司有一个产品,包括前台WEB界面和多个后台服务,各个服务都需要在前面界面中进行配置和控 制,以调整服务的行为.以前,配置文件都存放在数据库中,界面上修改配置后入库,并发送消息(Socket)通 ...
- [SDOI2014]数数
题解: 做过ac自动机上dp的这题应该就很容易想到了 首先在ac自动机上搞dp 表示当前考虑了i位,在自动机的j位上 然后转移就可以了 考虑限制 显然是一个数位dp 考虑位数小于n显然满足要求 考虑位 ...
- python全栈开发day37-html
web准备总结: 结构标准:相当于人的身体.html就是用来制作网页的. 表现标准: 相当于人的衣服.css就是对网页进行美化的. 行为标准: 相当于人的动作.JS就是让网页动起来,具有生命力的 1. ...