算法——第五章作业及学期总结
第五章 回溯算法
1. 你对回溯算法的理解
回溯算法,类似于上学期在数据结构中接触到的DFS(深度优先搜索),基本思路就是类比为一棵树分解成多种可能实现的路,并从根结点逐条遍历解空间树,若未找到解则倒回前一个结点,直到搜索到问题的一个解即可结束。
经典算法问题:(1)0-1背包问题 (2)旅行售货员问题 (3)装载问题 (4)n后问题
解题步骤一般可分为:1.确定题目类型属于遍历子集树问题还是遍历排列树问题;
2.套用对应的算法模板;
例子如下:
(1)遍历子集树函数
1 void Backtrack(int t)
2 {//以深度优先的方式遍历第t层中的某棵子树
3 if(t>n) { Output(x); return; }
4 if (……)
5 { x[t]=1; Backtrack(t+1); }
6 if (……)
7 { x[t]=0; Backtrack(t+1); }
8 }
(2)遍历排列数问题
1 void Swap(int *p,int *q)
2 { int temp;
3 temp=*p;*p=*q;*q=temp; }
4 void Backtrack(int t)
5 { //遍历第t层结点为根的某棵子树
6 int i;
7 if(t>n) { Output(x); return; }
8 for(i=t;i<=n;i++)
9 //x[1]~x[t-1]确定,获得x[t]~x[n]的不同组合
10 if(……)
11 { Swap(&x[t],&x[i]);
12 Backtrack(t+1);
13 Swap(&x[t],&x[i]); }
14 }
在这一章中,对一个限界函数有了新的了解。分为宽松型和严格型:
2. 你学习《算法分析与设计》课程的收获
以前对代码题的类型不知道怎么入手或者说怎么去区分,并按固定的模板去套用,经常一上手就做所以经常摸不着头绪。
但是今年学习该算法分析和设计课程之后,学会了几类典型题型,慢慢地学会套用代码框架,使整个结构更清晰。而且也会在几种算法中分析出时间复杂度和空间复杂度,从而得到更优的算法,减少各方面的开销。而不是以代码成功通过为唯一目的来选择算法,而是学会搜索最优算法来实现。
3. 你在学习过程中曾遇到了哪些困难,希望老师或助教及时给予帮助。
有一次是发现自己对动态规划算法还是有点搞不太懂,要求给出一个递归式而自己经常不会分析,在之后几次习题的练习、老师的讲解和助教的解答后慢慢学会了可以利用填表法(从上到下或从下到上)来进行动态规划的方式来解题。
同时也发现自己应试能力不足,在规定时间内完成规定代码题让自己经常就会忘记该选择什么样的算法来写。(于是就不知不觉用了大一的思想一步步写下来,没有用到合适的算法)
4. 你对本门课程的教学有哪些建议
利用结对编程来作为上机实验确实能学到很多东西,也能将队友的代码思路很好地来理解一遍。
建议:1.希望课堂上能完成的讲解就可以适当减少一些课后作业,确实在忙碌的时候课业压力显得比较大;
2.希望老师期末可以给些书面作业,大作业跟其他科目的复习撞在一起确实有一些些赶~
最后,感谢郑老师对我这个学期的教导,老师也是我遇到的很负责的老师(排第二没人敢排第一那种)~希望还能在之后的课程中有幸得到您的指导!