算法第五章作业及学期总结

1. 回溯算法的理解

 回溯的处理思想,有点类似枚举搜索。枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,把问题求解的过程分为多个阶段。每个阶段都会面对一个岔路口,先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。回溯法有两种典型的解空间树:

①当所给的问题是从n个元素的集合S中找中造到的两类典型的解空间树。当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。例如,n个物品的0-1背包问题所相应的解空间树就是一棵子集树。这类子集树通常有2”个叶结点,其结点总个数为2^(n+1)-1。遍历子集树的任何算法均需Ω(2^n)的计算时间。

②当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。挂列树通常有n!个叶结点。因此遍历排列树需要2(n)的计算时间。图5-3中旅行售货员问题的解空间树就是一棵排列树。

使用回溯算法解题的一般步骤:

a.针对所给问题得出一般的解空间   b.用回溯搜索方法搜索解空间   c.使用深度优先去搜索所有解并包含适当的剪枝操作,基本模板如下:

  1. //针对N叉树的递归回溯方法  
  2. void backtrack (int t)  
  3. {  
  4.     if (t>n) output(x); //叶子节点,输出结果,x是可行解  
  5.     else  
  6.        for i = 1 to k//当前节点的所有子节点  
  7.         {  
  8.             x[t]=value(i); //每个子节点的值赋值给x  
  9.             //满足约束条件和限界条件  
  10.           if (constraint(t)&&bound(t))   
  11.                 backtrack(t+1);  //递归下一层  
  12.         }
  13. }  

2. 你学习《算法分析与设计》课程的收获

本学期的算法课收获很多,学习到了很多有趣的算法知识,也认识到算法对于我们的生活也是有很大的关联的。明白了做题并不是单纯的把题给完成,而是要运用优化的算法去尽量减少时间和空间复杂度。以前对算法的时间复杂度和空间复杂意识不强烈。这种意识,必须反复经过刻意练习才能够获得。算法优化是有套路的:遇到算法题,一般我们都会从脑海中蹦出第一解法(这种解法一般都是暴力解法),然后,从时空角度层层分析,看看有没有更好的解法,看看这一题在数学上有没有对应的抽象。学习算法锻炼人的思维能力,程序 = 算法+编程,好的算法可以达到事半功倍,算法是很重要的。

3. 你在学习过程中曾遇到了哪些困难,希望老师或助教及时给予帮助。

有些题目的算法细节不理解,老师都会给我们仔细讲解。同时自己在编程容易出现习惯性的小问题,以及自己的实践还不够多。

4. 你对本门课程的教学有哪些建议

老师讲的很好,也很有趣,复杂的算法很容易理解,学到了很多。

 

posted @ 2020-12-19 22:43  hshuqi  阅读(122)  评论(0编辑  收藏  举报