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)spa
改进:
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次移位3d
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的乘法运算结果组装起来的时间(加法和位移操做)
画递归树更容易看出时间复杂度blog
第k级子问题数为3^k,树的高度为logn,最后一级k=logn,子问题数为3^logn,工做量为O(3^logn)=O(n^log3)=O(n^1.59),由于每一级时间成本几何增长,因此最后一级就是整个算法的时间复杂度递归
注:it