作者:mobiledu2502874233 | 来源:互联网 | 2023-08-29 14:37
目录[toc]学号201823232019-2020-1《数据结构与面向对象程序设计》第7周学习总结教材学习内容总结第12章算法分析什么叫做算法:是对特定问题求解方法,或者说是步骤
目录
[toc]
学号20182323 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结
教材学习内容总结
第12章
什么叫做算法:是对特定问题求解方法,或者说是步骤的一种描述。
什么叫做好算法(具有以下标准):
- 正确性
- 可读性
- 健壮性
- 通用性
- 效率与储存空间需求
冰与火之歌:【时间】与【空间】复杂度
时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。
算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同,称为算法的渐进复杂度,简称为时间复杂度。
其中f(n)是问题规模n的某个函数。这样用大写 O() 来体现算法时间复杂度的记法,我们称为大O记法
常见的时间复杂度如下图所示:
每个复杂度的时间比如下图所示:
第14章
什么是栈:栈是一个有序集合,其中添加和删除元素都是发生在同一端,通常称作发生操作的这一端为顶部,对应的端为底部。(先进后出)
栈的操作:
利用栈完成后缀表达式的计算:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将后缀表达式的结果计算出来。
实现队列的两种编程方法:
- 链表实现
- 数组实现
第15章
- 什么是队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。(先进先出)
- 实现队列
- 与栈类似:
- 数组每次被填满后,加入下一个元素时,把数组拓展成现有数组的两倍大小。
- 每次移除元素时,检测数组空余空间有多少。当数组里的元素个数只有整个数组大小的四分之一时,数组减半。
- 不同之处在于:
- 由于是先进先出,移除是从队列的最前端开始的。所以当我们移除数个数据后,队列数据是存储在数组的中间部分的。令队列数据的尾端数据ID为Num,首端数据ID为HeadIndex,则Num - HeadIndex为队列数据元素个数。
- 当队列数据元素个数为整个数组空间的四分之一时,数组减半,且队列数据左移至数组最左端。即Num-=HeadIndex;HeadIndex=0;
图中,HeadIndex=2;Num=5;
- 实现队列的两种编程方法:
- 链表实现
- 数组实现
教材学习中的问题和解决过程
不同点:
- 链表是链式的存储结构;数组是顺序的存储结构。
- 链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
- 链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。
相同点:
两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。
代码调试中的问题和解决过程
public void SelectionSortList(){
int min;
SelectionSortNode a = null;
SelectionSortNode b = null;
for (a=list.next;a!=null;a=a.next){
for (b=a.next;b!=null;b=b.next){
if (a.num>b.num){
min = b.num;
b.num = a.num;
a.num = min;
}
}
}
}
经检查后发现,a=list.next导致跳过了节点的头,所以第一个节点被跳过了,因此它并没有参与排序;
修改后的代码:
public void SelectionSortList(){
int min;
SelectionSortNode a = null;
SelectionSortNode b = null;
for (a=list;a!=null;a=a.next){
for (b=a.next;b!=null;b=b.next){
if (a.num>b.num){
min = b.num;
b.num = a.num;
a.num = min;
}
}
}
}
输入a=list,重新运行。
代码托管
结对及互评
点评模板:
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
教材学习中的问题和解决过程(2分)
代码调试中的问题和解决过程(2分)
本周有效代码超过300分行的(加0分)
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
点评过的同学博客和代码
其他(感悟、思考等,可选)
- 这两周学习任务有点重,学习的东西更加难了,加油加油。
- 课外的知识汲取很有必要,没事可以多看看别人的博客,交流经验
学习进度条
|
代码行数(新增/累积) |
博客量(新增/累积) |
学习时间(新增/累积) |
重要成长 |
---|
目标 |
10000行 |
30篇 |
400小时 |
|
第一周 |
77/77 |
2/2 |
15/15 |
|
第三周 |
424/501 |
3/5 |
30/30 |
|
第四周 |
393/894 |
2/7 |
30/30 |
|
第五周 |
320/1214 |
1/8 |
30/30 |
|
第六周 |
904/2118 |
2/10 |
30/30 |
|
第7周 |
1350/3468 |
3/13 |
30/30 |
|
计划学习时间:25小时
实际学习时间:20小时
改进情况:
参考资料