分治,即分而治之,是将一个规模为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++编程了,就要对自己有更高的要求,追求简洁及时间、空间复杂度降到最优的算法,这也是算法课存在的意义,也是你学了那么久编程的意义。打题还是要多思考,多严格要求自己,不能想着投机取巧,单纯完成题目就好。
接下来就是对结对编程情况的汇报。
觉得结对编程挺好的,因为结对编程,不仅关乎自己完成作业的情况,还关乎队友的。这个时候,你就会因为不好意思而要求自己做得好一点,不要拖累队友,也不能将编程任务全部推脱出去。在这一背后推力下,就能“迫使”自己往前走,从而有了进步。而且又可以一起思考,一起讨论,能更快的发现新解题思路,更快完成任务。
原文地址:https://www.cnblogs.com/wen-05/p/11671078.html