标签:ase 参考 规模 如何快速 分解 问题 再处理 str 3.1
分治算法大家都很熟悉,很多时候(比如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将已经解决的子问题合并,最终处理问题。
三、后续工作
接下来证明刚才的步骤是正确的分治算法。
//然而这并不简单,容我用纸先写一下。
标签:ase 参考 规模 如何快速 分解 问题 再处理 str 3.1
原文地址:http://www.cnblogs.com/sleeploke/p/7783131.html