20172328 2018-2019《Java软件结构与数据结构》第一周学习总结
20172328 2018-2019《Java软件结构与数据结构》第一周学习总结
概述 Generalization
本周学习了软件质量、数据结构以及算法分析的具体内容,主要依托于所用教材的第一章和第二章。
教材学习内容总结 A summary of textbook
第一章:概述
1.1软件质量
软件工程:是一门关于高质量软件开发的技术和理论的学科。
软件工程的目标:解决正确性问题、按时且在预算之内给出解决方案、给出高质量的解决方案、以合情合理的方式完成上面事情。
高质量软件的特征

重要解读:
有关可靠性:可靠的软件很少发生故障,即使发生了故障,也可以将该故障的影响降到最低。
有关可维护性:软件系统必须经过细心设计、编码和文档说明,以便为开发人员、维护人员和用户的工作提供支持。
有关可移植性:Java的源代码被编译成了字节码,这是一种低级语言,他不是任何特定CPU的机器语言。字节码运行在Java虚拟上(JVM)。JVM是一种解释并执行字节码的软件。
有关运行效率:软件必须高效地使用诸如CPU时间和存储器之类的资源。
1.2数据结构
数据结构:计算机存储、组织数据的形式。
程序 = 数据结构 + 算法
软件 = 程序 + 软件工程
Java工具包提供了强大的数据结构。常见的数据结构有数组(Array)、栈(Stack)、队列(Queue)、链表(Linked list)、树(Tree)、哈希表(Hash)、散列表(Hash Table)等。
栈会颠倒数据集的结构,而队列可以保持数据集的结构。
可用于给数列集排队的常用数据结构有有序列表、堆和散列表。
第二章:算法分析
2.1算法效率分析
算法分析:计算机科学中主要关注软件算法效率的主题。算法分析是计算机科学的基础。
2.2增长函数与大O记法
增长函数:表示与该问题大小相对应的时间或者空间的使用,表示问题(n)大小与我们希望最优化的值之间的关系。该函数表示了该算法的事件复杂度或空间复杂度。
渐进复杂度:称为算法的阶次。如书中示例,第二个洗盘子的算法具有阶次为n2的时间复杂度,记为O(n2),这种记法称为O()或者大O记法。算法的阶次是忽略该算法的的增长函数中的常量和其他次要项,只保留主项而得出的。
一些增长函数及其渐进复杂度[图片展示]

从而算法的阶次为增长函数提供了一个上界。
2.3增长函数的比较

标注:√10≈3.162277660168379、³√10≈2.1544、log₂(10)=lg(10)/lg(2)=1/lg(2)=3.321928,从最后一组数据来看,其实问题的关键不是提速CPU(因为提速处理器后帮助却小的可怜),而是要在算法上简化问题,大大提高程序运行的速度。
增长函数的比较图


2.4时间复杂度分析
2.4.1循环运行的复杂度分析
要分析某个算法的阶次,常常需要去确定某个特定语句和某个语句集运行的次数。要分析循环运行,首先要确定该循环体的阶次n,然后用该循环运行的次数乘以它。记请住,n是表示问题的大小。
就算循环有时会跳过几个数,增长函数变了,但常数不影响渐进复杂度,因此阶次不变。
2.4.2嵌套循环的复杂度分析
分析嵌套循环时,将内存循环和外层循环都要兼顾到,并且用乘法来计算复杂度。
方法调用的复杂度分析:与循环体的复杂度有关。
教材学习中的问题和解决过程 Problem and countermeasure
- 问题:在做老师课上的考试题时,一直觉得有道题运行次数是n(n-1),故复杂度应该表示为O(n(n-1)),但当时在书本实例中都没有看到有这种表示,先做了题,但没有深入了解。
- 解决:其实这个问题是自己没有认真看书的后果。书本15页下有这样一段话:
在这种情况下,内层循环索引被初始化为外层循环索引的当前值。外层循环运行了n次,内层循环第一次被执行n次,第二次执行n-1次,等等……但是,记住,我们只对主项感兴趣,而忽视其他常数项或其他任何次要项。如果复杂度是线性的,则不管经过多少个元素,其阶次依旧是O(n),因此,上面的代码的复杂度为O(n^2)。
课后习题作答 Exercise
- EX 2.1:下列增长函数的阶次是多少?
- a.10n^2+100n+1000
- 解答:阶次为:n^2。
- b.10n^3-7
- 解答:阶次为:n^3
- c.2n+100n3
- 解答:阶次为:n^3
- d.n^2 ·log(n)
- 解答:阶次:n^2 ·log(n)
- EX 2.4:请确定下面代码段的增长函数和阶次
for(int count = 0 ; count < n ; count++)
for(int count2 = 0 ; count2 < n ; count2 = count2 + 2)
{
System.out.println(count,count2);
}
}
- 解答:由内循环需要进行的次数是n/2,外循环需要进行的次数是n,故增长函数为F(n)=(n2)/2,阶次为n2
- EX 2.5:请确定下面代码段的增长函数和阶次
for(int count = 0 ; count < n ; count++)
for(int count2 = 1 ; count2 < n ; count2 = count2 * 2)
{
System.out.println(count,count2);
}
}
- 解答:由内循环进行的次数是log₂(n-1),外循环需要进行的次数是n,故增长函数为F(n)=n·log₂(n-1),又因阶数与增长函数的最高阶项有关,要忽略次项与常数项,所以阶次为n·log2(n)。
结对及互评 Group Estimate
点评模板:
- 博客中值得学习的或问题:
- 20172301:博客果然又很精彩,在教材学习中的问题和解决过程中花费了很多精力学习了一些本章中浅尝辄止的内容。优秀
20172328 2018-2019《Java软件结构与数据结构》第一周学习总结的更多相关文章
- 20172328 2018-2019《Java软件结构与数据结构》第三周学习总结
20172328 2018-2019<Java软件结构与数据结构>第三周学习总结 概述 Generalization 本周学习了第五章:队列.主要内容包含队列的处理过程.如何用对例如求解问 ...
- 20172328 2018-2019《Java软件结构与数据结构》第四周学习总结
20172328 2018-2019<Java软件结构与数据结构>第四周学习总结 概述 Generalization 本周学习了第六章·列表,主要让我们认识列表以及分析各种列表实现. 教材 ...
- 20172328 2018-2019《Java软件结构与数据结构》第五周学习总结
20172328 2018-2019<Java软件结构与数据结构>第五周学习总结 概述 Generalization 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...
- 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
20172328 2018-2019<Java软件结构与数据结构>第六周学习总结 概述 Generalization 本周学习了第十章:非线性集合与数据结构--树.主要讨论了树的使用和实现 ...
- 20172328 2018-2019《Java软件结构与数据结构》第七周学习总结
20172328 2018-2019<Java软件结构与数据结构>第七周学习总结 概述 Generalization 本周学习了第11章:二叉查找树.在本章中,主要探讨了二叉查找树的概念和 ...
- 20172328 2018-2019《Java软件结构与数据结构》第八周学习总结
20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍) ...
- 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结
20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
- 《JAVA程序设计》_第一周学习总结
20175217吴一凡 <java程序设计> 第一周学习总结 虽然已经做好了心理准备,但第一周的学习任务着实让我忙了整整三天,还是挺充实的吧.寒假已经在自己的电脑上安装好了虚拟机,我就在我 ...
- 201521145048《Java程序设计管理》第一周学习总结
1. 本周学习总结 学习并了解Java的发展与历史 在网上视频中学习Java 了解并区分JVM JRE JDK 将java与已学语言做比较,发现相同处 2. 书面作业 Q1.为什么java程序可以跨平 ...
随机推荐
- 初学cdq分治学习笔记(可能有第二次的学习笔记)
前言骚话 本人蒟蒻,一开始看到模板题就非常的懵逼,链接,学到后面就越来越清楚了. 吐槽,cdq,超短裙分治....(尴尬) 正片开始 思想 和普通的分治,还是分而治之,但是有一点不一样的是一般的分治在 ...
- Java【第八篇】面向对象之高级类特性
static 关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用.我们有 ...
- python之路day02--格式化输出、初始编码、运算符
格式化输出 格式化输出替换字符串.字符串中%占位符,,%%s就是代表百分号,不代表占位符s 字符串 stringd 数字 dight name = input('请输入你的名字:') age = in ...
- Django 中使用kindeditor
KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本 ...
- 消息框MessageBox+遍历控件
消息对话框:主要用来显示信息,也可以警告.用户确认取消等. MessageBox.Show("展示内容","标题",MessageBoxButtons.按钮种类 ...
- 2017-12-19python全栈9期第四天第二节之列表的增删查改之按索引改和按切片改
#!/user/bin/python# -*- coding:utf-8 -*-li = ['zs','ls','ww','zl','xx']li[0] = 'cxvb' #按索引位置print(li ...
- 机器学习 - 损失计算-softmax_cross_entropy_with_logits
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None) 第一个参数logits:就是神经网络最后一层的输出 第二个参数la ...
- Ubuntu设置和查看环境变量
设置环境变量的三种方法 1.1 临时设置 export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH 1.2 当前用户的全局设置 打开~/.ba ...
- CSS盒模型深入理解
前言 所有文档元素都生成一个矩形框,这称为元素框(element box),它描述了一个元素在文档布局中所占的空间大小.而且,每个框影响着其他元素框的位置和大小 宽高 宽度width被定义为从左内边界 ...
- Shiro 系列: 简单命令行程序示例
在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范. =======================Shiro INI 的基本规范================== ...
- 20172328 2018-2019《Java软件结构与数据结构》第三周学习总结
- 20172301:博客果然又很精彩,在教材学习中的问题和解决过程中花费了很多精力学习了一些本章中浅尝辄止的内容。优秀