分治法思想与体会

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

divide-and-conquer(P){编程

  if (|P|<=n0)设计模式

    adhoc(P);ide

  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)。后来加上了下面这两个语句。di

  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++编程了,就要对本身有更高的要求,追求简洁及时间、空间复杂度降到最优的算法,这也是算法课存在的意义,也是你学了那么久编程的意义。打题仍是要多思考,多严格要求本身,不能想着投机取巧,单纯完成题目就好。
 
  接下来就是对结对编程状况的汇报。
  以为结对编程挺好的,由于结对编程,不只关乎本身完成做业的状况,还关乎队友的。这个时候,你就会由于很差意思而要求本身作得好一点,不要拖累队友,也不能将编程任务所有推脱出去。在这一背后推力下,就能“迫使”本身往前走,从而有了进步。并且又能够一块儿思考,一块儿讨论,能更快的发现新解题思路,更快完成任务。
相关文章
相关标签/搜索