算法第五章作业及学期总结
1. 你对回溯算法的理解
理解:
回朔法就是系统地搜索一个问题的所有解或任一解。回溯法是将所有解构建成一棵树,通过深度优先搜索方式搜索所有解,并利用剪枝函数和限界函数排除一些不可能的解,减少搜索的次数。
回朔法的基本步骤:
(1)针对具体问题,定义其解空间
(2)确定易于搜索的解空间结构(子集树、排序树等)
例如:0-1背包要考虑所有物件是否放进去,可选用子集树表示
而n后问题可以看成是将n个皇后按顺序排好,可选用排序树表示
(3)用深度优先方式搜索树,并在搜索过程中用剪枝函数避免无效搜索。
剪枝函数:
(1)约束函数:用于在扩展结点处减去不满足约束的子树。例如在0-1背包问题中,利用判断将物体放入是否将背包放满而剪去枝叶
(2)限界函数:用于剪去得不到最优解的子树。例如在0-1背包问题总,利用一个函数计算剩下的全部物品加上当前背包的价值与最大值相比,而选择是否搜索 以下的子树
两类结构树的一般算法:
(1)子集树
void Backtrack(int t) { if(t>n) //到达叶子结点 Output(x); if(Constraint(t) //利用约束函数判断是否进入左子树 { x[t]=1; Backtrack(t+1); x[t]=0; } if(Bound(t)) //利用限界函数判断是否进入右子树 { Backtrack(t+1); } }
(2)排序树:
void Backtrack(int t) { if(t>n) //到达叶子结点 Output(x); else{ for(int i=t;t<=n;i++){ //对每个叶子结点进行搜索 Swap(x[t],x[i]); if(Constraint(t)&&Bound(t)) Backtrack(t+1); Swap(x[t],x[i]); } } }
2. 你学习《算法分析与设计》课程的收获
学习了很多基本的算法思想,也启发了思想,对很多问题有了很多新的,不同角度的看法和解法,收获满满。
3. 你在学习过程中曾遇到了哪些困难,希望老师或助教及时给予帮助。
一开始学习动态规划可能会有点懵,但是通过数组和多次思考,再加上老师的讲解,渐渐搞懂了。
非常感谢老师和助教对我们一学期的帮助。
4. 你对本门课程的教学有哪些建议
老师很棒!!