20162329张旭升 2017-2018-2 《程序设计与数据结构》第一周学习总结
20162329 2017-2018-1 《程序设计与数据结构》第一周学习总结
教材学习内容总结
本周学习主要以书的第十二章为主,学习内容如下:
1. 算法效率:
-
概括来说算法效率就是CPU在执行该算法时所消耗的时间的多少,即执行速度的快慢,一个好的算法可以大大节约时间,使得整个程序的效率更高。那么怎样的算法可以被称为好的算法呢?
比如我们现在需要设计一个将数字从1
一直加到n
实现代码如下:
方案一:
public int sum(int n){
int result = 0;
for ( i = 1 , i <= n , i++ ){
result += i;
}
return result;
}
方案二:
public int sum (int n) {
int result = n * ( n + 1 ) / 2;
return result;
}
以上这两段简单的代码都可以实现从1加到n这个目的,但是它们的效率却是不同的,那么为什么这么说呢?这就引出了我们这一章的下一个内容
2. 增长函数和大O符号:
-
增长函数是我们用来具象化表示一段代码的时间复杂度或空间复杂度的方法,而大
O
符号通常被我们用来表示该算法的时间复杂度。
就上面的两个解决同一个问题的两个不同算法来说,方法一运用了for
循环可以体现的时间复杂度为O(n)
,而方法而只用了一条赋值语句,所以它的时间复杂度为O(1)
,然而后者的复杂度显然更小,所以我们可以说第二中方案所用的算法是更高效的。
3. 比较增长函数:
-
由上述两个方面可知,增长函数的重要性是不言而喻的,如下图可知
当问题n
变得足够的大时,不同算法的增长函数会使CPU的运行时间大不相同,经过比较我们发现,当n
足够大时,它的阶乘和指数阶的算法几乎是无法运行的,所以相比来说我们可以认为幂次以及对数和常数阶的算法是可用并且高效的!
4. 分析递归程序:
在这一部分内容中我认为最重要的就是对递归程序求阶,而与其他程序不同的是,其他程序的阶是将循环体的阶乘上循环执行的次数而得到
,而递归程序不同,递归程序本身就是一个类似循环的结构,即每次调用自己时就执行一次循环,所以它的阶是递归程序调用自身的次数乘上递归程序本身的阶
教材学习中的问题和解决过程
暂时没有什么问题。。。。
代码调试中的问题和解决过程
该章节主要是概念理解的学习,并未涉及到相关代码编写调试。。。
代码托管
结对及互评
点评模板:
- 博客中值得学习的或问题:
- 界面很好看
- 问题分析可以更详细
- 其他
希望我们结对在这学期能相互促进,技术更上一层楼。
本周结对学习情况
- [20162302](博客链接)
- 结对学习内容
- 本周学习并没有实践内容所以没有共同项目。
其他
这是本学期的第一篇博客,本学期我们要学习的是数据结构和算法,这新一章的内容就是算法的分析,感觉多了许多概念性的东西,老师讲过 程序 = 数据结构 + 算法
所以这一学期的内容对我来说是非常重要的,我希望自己能在这一学期有更大的提升!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/200 | 1/2 | 10/20 |
-
计划学习时间:20小时
-
实际学习时间:10小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)