算法第二章作业

一、对分治法思想的体会

1、分治法的基本思想

  • 将要求解的较大规模的问题分割成k个更小规模的子问题。
  • 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。
  • 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

 

注:在用分治法设计算法时,最好使子问题的规模大致相同,这是出于一种平衡子问题的思想。

 

 

2、一般的算法模式

 

divide-and-conquer(P)
{  if (|P|<=n0)     return adhoc(P); //|P|<=n0表示P的规模不超过阈值n0,可直接求解。
   divide P into smaller subinstances P1, P2, ..., Pk;//分解问题
   for (i=1; i<=k; i++)
       yi=divide-and-conquer(Pi);//递归解各子问题
   return merge(y1, ..., yk); //算法Merge(y1, …, yk)表示将子问题的解合成P的解
}

 

其中,|p|表示问题P的规模;n0为不需要再分解问题的阈值;adhoc是基本子算法,可以直接求解;merge用于将子问题的解合并为原问题的解。

 

3、分治算法的时间复杂性

      

用主定理求解型为T(n)=aT(n/b)+O(nd)的递归方程

设a>=1和b>1是常数,f(n)是一个函数,T(n)是定义在非负整数集上的函数:T(n)=aT(n/b)+ O(nd) 。

 

 

4、分治法适用的情况

分治法所能解决的问题一般具有以下几个特征:

 

  • 该问题的规模缩小到一定的程度就可以容易地解决
  • 问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
  • 利用该问题分解出的子问题的解可以合并为该问题的解;
  • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

 

 

二、结对编程感想

两个人一起编程和自己一个人编程的感受有很大的不同,认识到了每个人之间编程习惯的差异。

结对编程能够为解决问题提供更多的思路,可能小伙伴擅长的正是我所缺失的,能够大大提高解决问题的效率,与此同时,我们还能够互相发现各自在编程过程中出现的一些错误。不知道大家有没有过这样的体验:代码出现错误,但是自己找来找去都找不到问题所在,觉得自己哪也没错,但是当你让伙伴帮忙看一下时,对方却可以发现错误所在。可能是因为大家看自己的孩子(代码)总是会忽略掉它的缺点。

但它对于我来说,也存在一些问题。因为在编程过程中需要合作和讨论,我对于问题的专注力会有所下降,不能够全身心投入。

 

posted @ 2019-10-13 20:57  WWYlaowu  阅读(233)  评论(0)    收藏  举报