分治法思想与体会

  分治,即分而治之,是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题的解合并得到原文题的解。其算法设计模式如下:

divide-and-conquer(P){

  if (|P|<=n0)

    adhoc(P);

  divide P into smaller subinstances P1,P2,...,Pk;

  for (i=1; i<=k; i++)

    yi = divide-and-conquer(Pi);

  return merge(y1,y2,...,yk);

在人们大量的实践中,发现在用分治法的时候,使子问题规模大致相同是最好的,,而许多问题中,将一个问题分成大小相等的k个子问题的处理方法(一般情况下k=2)几乎总是比子文体规模不等的好。

 

  对分治法深有体会的一次是第一次结对编程那会的第二题。原先老师还没要求时间复杂度为O(log2 n)时,我是直接在main函数里直接写了if进行判断的,然后一堆的判断语句。把时间复杂度扩大到了O(n)。后来就开始思索要怎样将复杂度变小。当时是明确知道要用二分法才能将时间复杂度变小,但还不知道怎么在find函数里添加语句进行判断。用二分法就可以将时间复杂度变为O(log2 n)。后来加上了下面这两个语句。

  if(x<a[l]) cout<<l-1<<" "<<l;//以a[l]为界,如果x在a[l]左边,那么输出l以及l+1
  if(x>a[l]) cout<<l<<" "<<l+1;//如果x在a[l]左边,那么输出l-1以及l
   
  然后瞬间把10几行if判断的语句缩减成两行,又降低了计算的时间复杂度,就觉得很神奇。解决问题有很多方法,但既然已经是第二年学习C++编程了,就要对自己有更高的要求,追求简洁及时间、空间复杂度降到最优的算法,这也是算法课存在的意义,也是你学了那么久编程的意义。打题还是要多思考,多严格要求自己,不能想着投机取巧,单纯完成题目就好。
 
  接下来就是对结对编程情况的汇报。
  觉得结对编程挺好的,因为结对编程,不仅关乎自己完成作业的情况,还关乎队友的。这个时候,你就会因为不好意思而要求自己做得好一点,不要拖累队友,也不能将编程任务全部推脱出去。在这一背后推力下,就能“迫使”自己往前走,从而有了进步。而且又可以一起思考,一起讨论,能更快的发现新解题思路,更快完成任务。

 

posted on 2019-10-14 14:04  WeN。  阅读(725)  评论(0编辑  收藏  举报