如何快速正确的写出各种分治算法的实现代码

分治算法大家都很熟悉,很多时候(比如ACM竞赛)当我们判断出一个问题可以用分治算法来解决的时候,却往往因为具体的问题的复杂性,难以很快理清思路,迅速正确地写出问题的分治算法。

因此,要想快速正确的写出分治算法的实现代码,就必须足够的认识分治算法。直接看结论

一、认识分治

在分治策略中,我们递归地解决一个问题,在每层递归中应用如下三个步骤:

1.分解(Divide):将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。

2.解决(Conquer):递归地求解出子问题。如果子问题规模足够小,则停止递归,直接求解。

3.合并(Combine):将子问题的解组合成原问题的解。

此外还需要补充两个定义:

1.当问题足够大,需要递归求解时,称为递归情况(recursive case)

2.当问题足够小,不需要递归求解时,我们说递归已经触底,进入了基本情况(base case)

这些定义具体可以参考《算法导论》,在此我不加以赘述。

关于分治我们已经有了一定的了解,但是依然无法快速正确的写出分治的算法,这是很自然的。

每当我们思考使用分治的时候,我们都有分开思考过三个步骤和两个情况。

而且这很容易做到,但是我们却无法写出具体的代码,关键原因在于我们不清楚这些步骤和情况之间的关系

 

二、解决分治

首先给出一个简单的步骤描述:

1.先处理基本情况

  1.1判断问题规模

  1.2如果是基本情况则直接解决问题

2.再处理递归情况

  2.1先在脑海中思考,该问题可具体分解成哪些子问题

  2.2再按顺序递归调用

3.最终合并

  3.1将已经解决的子问题合并,最终处理问题。

 

三、后续工作

接下来证明刚才的步骤是正确的分治算法。

//然而这并不简单,容我用纸先写一下。

posted @ 2017-11-04 14:42  sleep_loke  阅读(882)  评论(0编辑  收藏  举报