x,y为两个长度为n位的整数,计算它们的积
X=A2^n/2+B ,Y=C2^n/2+D。这样,X和Y的乘积为:

XY=(A2^n/2+B)(C2^n/2+D)=AC*2^n+(AD+CB)2^n/2+BD
4次n/2位整数的乘法(AC,AD,BC和BD),以及3次不超过n位的整数加法(式中的加号),此外还要做2次移位(分别对应于式中乘2n和乘2n/2)。所有这些加法和移位共用O(n)步运算
T(N)=4T(N/2)+ O(N) T(n)=O(n^log4)=O(n^2)

改进:
XY=(A2^n/2+B)(C2^n/2+D)=AC*2^n+(AD+CB)2^n/2+BD
=AC2^n+[(A-B)(D-C)+AC+BD]*2^n/2+BD
需做3次n/2位整数的乘法(AC,BD和(A-B)(D-C)),6次加、减法和2次移位

T(N)=3T(N/2)+ O(N) T(n)=O(n^log3)=O(n^1.59)
T(N)为长度为n的乘法运算,可变为3个长度为n/2的乘法运算, O(N)把3个长度为n/2的乘法运算结果组装起来的时间(加法和位移操作)
画递归树更容易看出时间复杂度
T(N)=AT(N/B)+ O(F(N))

T(N)=3T(N/2)+ O(N)

第k级子问题数为3^k,树的高度为logn,最后一级k=logn,子问题数为3^logn,工作量为O(3^logn)=O(n^log3)=O(n^1.59),因为每一级时间成本几何增加,所以最后一级就是整个算法的时间复杂度

注:
证明O(3^logn)=O(n^log3)


sandy
7 声望1 粉丝