算法第五章作业及学期总结
1. 回溯算法的理解
回溯的处理思想,有点类似枚举搜索。枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,把问题求解的过程分为多个阶段。每个阶段都会面对一个岔路口,先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。回溯法有两种典型的解空间树:
①当所给的问题是从n个元素的集合S中找中造到的两类典型的解空间树。当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。例如,n个物品的0-1背包问题所相应的解空间树就是一棵子集树。这类子集树通常有2”个叶结点,其结点总个数为2^(n+1)-1。遍历子集树的任何算法均需Ω(2^n)的计算时间。
②当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。挂列树通常有n!个叶结点。因此遍历排列树需要2(n)的计算时间。图5-3中旅行售货员问题的解空间树就是一棵排列树。
使用回溯算法解题的一般步骤:
a.针对所给问题得出一般的解空间 b.用回溯搜索方法搜索解空间 c.使用深度优先去搜索所有解并包含适当的剪枝操作,基本模板如下:
- //针对N叉树的递归回溯方法
- void backtrack (int t)
- {
- if (t>n) output(x); //叶子节点,输出结果,x是可行解
- else
- for i = 1 to k//当前节点的所有子节点
- {
- x[t]=value(i); //每个子节点的值赋值给x
- //满足约束条件和限界条件
- if (constraint(t)&&bound(t))
- backtrack(t+1); //递归下一层
- }
- }
2. 你学习《算法分析与设计》课程的收获
本学期的算法课收获很多,学习到了很多有趣的算法知识,也认识到算法对于我们的生活也是有很大的关联的。明白了做题并不是单纯的把题给完成,而是要运用优化的算法去尽量减少时间和空间复杂度。以前对算法的时间复杂度和空间复杂意识不强烈。这种意识,必须反复经过刻意练习才能够获得。算法优化是有套路的:遇到算法题,一般我们都会从脑海中蹦出第一解法(这种解法一般都是暴力解法),然后,从时空角度层层分析,看看有没有更好的解法,看看这一题在数学上有没有对应的抽象。学习算法锻炼人的思维能力,程序 = 算法+编程,好的算法可以达到事半功倍,算法是很重要的。
3. 你在学习过程中曾遇到了哪些困难,希望老师或助教及时给予帮助。
有些题目的算法细节不理解,老师都会给我们仔细讲解。同时自己在编程容易出现习惯性的小问题,以及自己的实践还不够多。
4. 你对本门课程的教学有哪些建议
老师讲的很好,也很有趣,复杂的算法很容易理解,学到了很多。