化繁为简,分而治之,结对编程,共同进步

——算法第二章总结 软三 杨伟耿 20181003083

一、 化繁为简,分而治之

不难发现,无论生活中还是编程学习中,我们难免遇到困难复杂的问题。简单的东西,我们往往一步到位,只需按部就班就可以轻松解决。

但是那些复杂的难题呢?

俗话说,“方法总比困难多”,我想最直接最暴力实用最容易想到的不就是把这个问题当作简单的问题来解决吗?可是,它就是那么复杂那么困难,怎么就能“掩耳盗铃”地当作“送分题”来看待啊?

数学上我们都学过数学归纳法,规模庞大复杂的证明问题,我们可以把它细分成一块一块的小问题,最后推理出这整一个问题的解。生活中,比如我们打扫卫生,学校那么大,分给每个班负责不同的地方,于是每个班都只分到其中一块,细分下去,班里的同学每人也只是打扫其中一小块。类似的,在编程问题上,我们也可以将规模大的问题分为规模小的相同的子问题一一用相同的方法解决,最后再合并,这便是分治法的思想。

用专业的术语来说,就是将一个规模为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);

 

其中,|p|表示问题p的规模,n0为一阈值,表示当问题P的规模不超过n0时,问题容易解出,不必再继续分解。adhoc(P)是该分治法中的基本子算法,用于直接解小规模的问题P。

分治法可以解决很多问题,比如二分搜索、归并排序、快速排序、Strassen矩阵乘法、棋盘覆盖等。

 

二、 结对编程,共同进步

结对编程最直观最深刻的感受,于我而言,就是错误率大大地降低,解决难题地效率大大提高,方法更好更多样。两个人一起解决一道难题特别舒爽,简单的粗心的语法错误得到避免,不会的问题可以一起讨论,实现共同进步。尤其是和自己厉害的人组队,可以从他那里学到很多自己没有的东西或者改正自己的缺点和错误。但是,不好的地方也有,就是有时候一个人打码可以心无旁骛,不用告诉别人自己的想法,可以不被打断,可以不用让别人听懂自己的方法(有时候不知道怎么和别人讲),一道题一道题一直打,一直爽。

posted on 2019-10-13 20:11  mikasawell  阅读(193)  评论(0编辑  收藏  举报