如何快速正确的写出各种分治算法的实现代码
Posted sleep_loke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速正确的写出各种分治算法的实现代码相关的知识,希望对你有一定的参考价值。
分治算法大家都很熟悉,很多时候(比如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将已经解决的子问题合并,最终处理问题。
三、后续工作
接下来证明刚才的步骤是正确的分治算法。
//然而这并不简单,容我用纸先写一下。
以上是关于如何快速正确的写出各种分治算法的实现代码的主要内容,如果未能解决你的问题,请参考以下文章