算法第五章作业及学期总结
一、算法第五章——回溯法
1. 对回溯算法的理解
回溯法就是一种高配版穷举法。它是对问题构造出解空间树之后,利用有条件的深度优先遍历进行搜索。相比穷举式搜索法,回溯法可以通过限界函数、约束函数进行剪枝,从而提高搜索的效率。
void Backtrack(int t) {//以深度优先的方式遍历第t层中的某棵子树 if(t>n) { Output(x); return; } if (……) {//进入左子树 x[t]=1; Backtrack(t+1); } if (……) {//进入右子树 x[t]=0; Backtrack(t+1); } }
void Swap(int *p,int *q) { int temp; temp=*p; *p=*q; *q=temp; } void Backtrack(int t) { //遍历第t层结点为根的某棵子树 int i; if(t>n) { Output(x); return; } for(i=t;i<=n;i++) { //x[1]~x[t-1]确定,获得x[t]~x[n]的不同组合 if(……) { Swap(&x[t],&x[i]); Backtrack(t+1); Swap(&x[t],&x[i]);//回溯 } } }
二、学期总结
(一)学习《算法分析与设计》课程的收获
1. 本学期的算法课程主要学习了分治法、动态规划法、贪心法、回溯法、了解了分支限界法、随机化算法。学习这些算法是一种可以说是技能上的收获,但更重要的是一种思想的收获。我们学到了这些算法对一个问题是如何进行分析、如何找出解决方案、如何用代码来实现以及如何分析这个算法的效率,以后,遇到别的算法,也可以用这种思想去吃透他。
2. 需要根据不同的应用场景的不同需求,选择一个适合这个场景的算法,会大大提高程序运行的效率,不一定他是同类算法中效率最高的,但是在这个应用场景下就是最优的。,同时也认识到没有绝对优势的算法,有时候更小的时间复杂度,是以损耗更大的空间为代价的。
(二)学习过程中曾遇到了哪些困难,希望老师或助教及时给予帮助。
学习过程中遇到的困难无非就是PTA代码不能通过,有时候是小细节、边界没考虑好等的问题,但是有时候是整个代码的思路都错了,这个问题就比较严重了,如果这种情况下,可以及时问问老师或助教这个思路错在哪、应该用什么思路才是正确,才不会在错误的道路越走越远。
还有有时候就是上课听懂了,但是下课自己打代码的时候,思路就有点懵,比如学动态规划的时候,自己会很纠结问题的表示、要用一维还是二维以及是要填一个怎样的表什么的然后就会卡壳什么的(可能是还没get到动态规划的精髓)这个时候如果老师或助教及时给予帮助,可能就会恍然大悟啥的。
(三)对本门课程的教学有哪些建议
老师的课程教学安排已经几乎是完美了,课堂教学与上机实践,让学生充分接收并吸收学习的内容,特别是结对编程然后进行讲解的安排真的很不错。然后课外安排PTA作业也有及时讲解真的不错。以及安排每章节的博客作业,加深学生对该章节学习内容的理解,不过或许博客作业安排对某道题目进行分析的同时可以加上对本章知识进行小结,可能就对整章的学习脉络结构更加清晰。
同时,如果老师每章的教学开始前,简略的提一下本章教学的教学计划就比如说会从哪哪哪来展开教学之类的,学生就可能会思路上更清楚。(也不知道对不对老师我就随便说说的)