教材学习内容总结
概述
- 软件工程:是一门关于高质量软件开发的技术和理论的学科,用来控制开发过程,实现高质量的软件。
-
软件工程的目标:正确性、可靠性、健壮性、可用性、可维护性、可重用性、可移植性、运行效率。
对于可靠性和健壮性这两个较难区分的特征我的理解是:可靠性可以看做一个人容易不容易生病,健壮性可以看成一个人生病后恢复的难易程度,是身体强壮康复快还是落下病根罒ω罒 - 程序=数据结构+算法 ;软件=程序+软件工程
- 数据结构:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
常用的数据结构比如栈(先入后出)和队列(先入先出)
算法分析
- 算法分析:是对一个算法需要多少计算时间和存储空间作定量的分析。算法是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。算法分析是计算机科学的一个基础,并涉及多种技术和概念。
- 算法效率:算法效率是指算法执行的时间,算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量,通常是CPU的使用时间。
- 增长函数:表示问题(n)大小与我们希望最优化的值之间的关系。该函数表示了该算法的时间复杂度(CPU的使用时间)或空间复杂度(内存空间)。
- 渐进复杂度(随着n增加时增长函数的一般性质)称为算法的阶次。算法的阶次是忽略该算法的增长函数中的常量和其他次要项,只保留主项而得出的。
- 大O记法/O():与问题大小无关、执行时间恒定的增长函数称为具有O(1)的复杂度。
- 具有相同阶次的算法,从运行效率的角度来说都认为是等价的。
- 更快的CPU只能给函数增加常量,增加的值是固定的,而算法分析可以随着函数的变化提高增值,所以不能通过提高处理器速度来替代算法分析。
- 增长函数的比较:
n相对较小时各种增长函数的比较
n很大时,各种增长函数的比较
- 循环运行的时间复杂度分析:循环体的阶次n乘以该循环要运行的次数。
- 例1:时间复杂度为n * O(1) = O(n)
for(int count=0;count<n;count++) { /*复杂度为O(1)的步骤系列*/ }
- 例2:时间复杂度为O(log2(n));进行次数为x,所以2^x=n,x=log2(n),复杂度为O(1),所以为O(log2(n))
count=1 while(count<n) { count *=2 /*复杂度为O(1)的步骤系列*// }
- 嵌套循环的复杂度分析
- 例1:内层复杂度为O(n),外层为O(n),故为O(n^2)
for{int count=0;count<n;count++) { for(int count2=0;count2<n;count2++) { /*复杂度为O(1)的步骤系列*/ } }
- 方法调用的复杂度分析
- 例1:复杂度为printsum方法的复杂度乘以该循环的运行次数,即为O(n)*O(n)=O(n^2)
printsum方法为
for (int count=0 ; count<n; count++) { Printsum(count); }
public void printsum(int count) { int sum =0; for(int i=0; i<count; i++) sum += i; System.out.println(sum); }
- 例2:增长函数为复杂度相加,f(n)=1+n+n^2;得出时间复杂度为O(n^2)
public void sample (int n) { printsum(n); //该方法调用复杂度为O(1) for(int count =0;count<n;count++) //该循环复杂度为O(n) printsum(count); for(int count =0;count<n;count++) //该循环复杂度为O(n^2) for(int count2 =0;count2<n;count2++) System.out.println(count,count2); }
- 例1:复杂度为printsum方法的复杂度乘以该循环的运行次数,即为O(n)*O(n)=O(n^2)
作业解答
-
EX2.1求阶次
-
a.10n^2+100n+1000
解:阶次是n^2。式子中渐进复杂度最高的是n^2,它的增长速度最快。
-
b.10n^3-7
解:增长速度最快的是n^3
-
c. 2^n+100n^3
解:2^n的增长速度大于n^3,所以阶次是2^n
-
d. n^2logn
解:由于是相乘,所以为原式n^2logn
-
-
EX2.4
for(int count = 0 ; count < n ; count++) for(int count2 = 0 ; count2 < n ; count2 = count2 + 2) { System.out.println(count,count2); } }
解:外层循环进行次数为n,内层循环为1/2n,所以增长函数f(n)=n* 1/2n=1/2n^2;阶次为n^2
-
EX2.5
for(int count = 0 ; count < n ; count++) for(int count2 = 1 ; count2 < n ; count2 = count2 * 2) { System.out.println(count,count2); } }
解:外层循环需要进行次数为n,内层循环需要进行次数为为x,则2^x=n,x=log2(n),所以增长函数是f(n)=nlog2(n),而阶数与增长函数的最高阶项有关,要忽略次项与常数项,阶次是nlog2(n).
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
积累 | 0/7359 | 3/17 | 30/330 |
第一周 | 0/0 | 1/1 | 8/8 |
结对及互评
点评模板:
- 博客中值得学习的或问题:
- 20172305谭鑫的博客中课本疑难问题解决的很好,内容全面。
- 20172323王禹涵的博客中课本内容总结详实,感悟深刻。
- 基于评分标准,我给谭鑫的博客打分:7分。得分情况如下:
- 问题加分3分
- 感悟不假大空加1分
- 排版精美的加1分
-正确使用Markdown语法加1分
-模板中的要素齐全加1分
- 基于评分标准,我给王禹涵的博客打分:5分。得分情况如下:
- 排版精美的加1分
- 问题加分1分
- 感悟不假大空加1分
-正确使用Markdown语法加1分
-模板中的要素齐全加1分
感悟
有一段时间没有学习了,假期有点点懈怠,突然学习两章内容,看了很久,感觉还没进入状态比较生疏,有些概念较难分清,新的一学期仍需继续努力,多多联系,对课本的理解要到位,加油吧!