1、分治法
有两点需要理解:
(1)分治法基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。
(2)递归的解这些子问题,然后将各子问题的解合并得到原问题的解。
分治法的重点是分析问题是否可以划分为规模较小的子问题,难点是如何划分以及划分之后如何将各个子问题的解合并成最终的解。这一般需要用到数学知识或者其他理论。
以大数相乘为例,有A,B两个大数,都为n位,要计算A*B,需要将A和B划分成两等份,如下图所示:
Paste_Image.png
将A分成a1和a0两等份,将B分成b1和b0两等份,长度都为n/2。那么有:
A = a1 * 10^(n/2) + a0
B = b1 * 10^(n/2) + b0
A * B = c2 * 10^n + c1 * 10^(n/2) + c0
其中:
c2 = a1 * b1
c1 = a0 * b1 + b0 * a1 = (a1 + a0) * (b1 + b0) - (c2 + c0)
(尽量减少乘法运算,需要将c1变形成后面的式子)
这样,就进行了一次划分,然后继续递归进行划分,每次划分都按照以上式子进行合并