20162327 2017-2018-1 《程序设计与数据结构》第1周学习总结
一、教材学习内容总结
- 1、算法分析是计算机科学与技术的基础课程
- 2、增长函数显示了与问题大小相关的时间或空间利用率
- 3、算法的阶有算法增长函数的主项决定
- 4、算法的阶给出了算法增长函数的上界
- 5、更快的处理器不能弥补当问题的大小增大时算法的低效率
- 6、分析算法的复杂度的时候经常需要分析循环的执行情况
- 7、嵌套循环的分析必须要考虑内层和外层循环的执行情况
- 8、确定递归算法的阶,需要确定递归的阶,再乘以递归的方法体阶
- 9、具有某个指定阶的所有算法从效率上来看是等价的
- 10、复杂度和增长函数的计算方法等,注意只有可执行的语句才对时间复杂度起作用
- 11、算法的运行时间以及运行时间上下限的表示方法
二、有关数据结构和算法分析的概念问题
- 1、数据结构的三大要素:数据的逻辑结构、数据的存储结构、数据的运算
- 2、设计算法的步骤:1、设定算法初始条件
2、确定算法的结束条件
3、 按问题的普遍规律给出算法处理的流程
4、考虑临界点和特殊点的处理
5、考虑异常情况 - 3、如何衡量算法复杂度?
1、内存
2、时间
3、指令的数量
4、特定操作的数量
5、磁盘访问数量
6、网络包数量 - 4、渐近记号:通常有 O、 Θ和Ω 记号法。Θ 记号渐进地给出了一个函数的上界和下界,当只有渐近上界时使用 O 记号,当只有渐近下界时使用Ω 记号。尽管 技术上Θ 记号较为准确,但通常仍然使用 O 记号表示。
- 5、为什么要进行算法分析?
1、预测算法所需的资源
计算时间(CPU 消耗)
内存空间(RAM 消耗)
通信时间(带宽消耗)
2、预测算法的运行时间
在给定输入规模时,所执行的基本操作数量。 或者称为算法复杂。 - 6、算法分析要保持大局观(Big Idea),其基本思路:
1、忽略掉那些依赖于机器的常量。
2、关注运行时间的增长趋势。
三、有关算法复杂度的讨论
for(i = 0;i<n;i++) x++;
while(i = n)
int i = 0;
i++;
x++;
- 对于这段代码的复杂度的分析:i = 0 执行了一次,i++ 执行了n 次,处于循环中的 x++ 也执行了n 次,所以该段程序的频度f(n) = n + n + 1=2n + 1,时间复杂度为O(n)
for(i = 0;i<n;i++){
for(j = 0;j<n;j++) x++;
}
- 对于这段代码的复杂度的分析:第一个循环中的 i = 0 执行了一次,i++ 执行了n 次,所以第一个循环一共执行了n + 1次;
而内层循环中的 j++ 执行了n 次;最后的x++因为套在内循环内所以要执行n^2次。
综上所述,该段程序的频度为f(n) = n + 1 + n*(n + 1) + n^2 ,时间复杂度为O(n^2).
i = 1;
while(i<=n)
i = i*2;
- 该段代码的频度为2^f(n) = n,即f(n) = ㏒n(以二为低),复杂度为O(㏒n).
## 四、几个典型的增长函数的比较
-![](http://images2017.cnblogs.com/blog/1065480/201709/1065480-20170910223325913-476176763.png)
- 小规模的输入在运行时间上的差别不足以将高效的算法和低效的算法区分开,时间复杂度并不表示一个程序解决问题所需要的时间,而是表示当问题规模扩大后程序运行需要的时间长度增长的有多快。
## 五、结对及互评
- 结对对象20162328[(博客链接)]新学期,新搭档,新气象,一起努力。
## 六、其他
- 新学期的第一篇博客,不多说,滚去学习!
## 学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 100 | 1 | 8 | |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:[软件工程软件的估计为什么这么难](http://www.cnblogs.com/xinz/archive/2011/04/05/2005978.html),[软件工程 估计方法](http://www.cnblogs.com/xinz/archive/2011/04/06/2007294.html)
- 计划学习时间:XX小时
- 实际学习时间:XX小时
- 改进情况:
(有空多看看[现代软件工程 课件
软件工程师能力自我评价表](http://www.cnblogs.com/xinz/p/3852177.html))
## 参考资料
- [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)
- [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)