利用分治法求解大乘数

利用分治法求解大乘数

Master定理

Master定理:对于一个规模为n的问题,通过分治将每个问题分解成a个规模为 n/b的子问题,每次递归带来的额外运算为 f ( n ) = θ ( n c ) f(n)=\theta (n^c) f(n)=θ(nc),那么可得到它的时间复杂度关系式:

T ( n ) = a T ( n b ) + θ ( n c ) T(n)=a T(\frac{n}{b})+\theta (n^c) T(n)=aT(bn)+θ(nc)

d = l o g b a d=log_ba d=logba

  • 若 d>c,则 T ( n ) = O ( n d ) T(n)=O(n^d) T(n)=O(nd)
  • 若 d=c,存在 k > = 0 k>=0 k>=0, 使得 f ( n ) = n d ∗ l o g k n f(n)= n^d * log^k n f(n)=ndlogkn, 则 T ( n ) = O ( n d ) ∗ l o g k + 1 n T(n)=O(n^d )* log^{k+1} n T(n)=O(nd)logk+1n
  • 若 d<c, 则 T ( n ) = O ( n c ) T(n)=O(n^c) T(n)=O(nc)

简介

给与两个比较大的数X和Y,且不能直接用基本类型表示,利用分治思想将X、Y分别拆分为A与B、C与D(长度不同可以补0)。

X ∗ Y = ( A ∗ 1 0 n 2 + B ) ( C ∗ 1 0 n 2 + D ) = A ∗ C ∗ 1 0 n + A ∗ D ∗ 1 0 n 2 + B ∗ C ∗ 1 0 n 2 + B ∗ D X*Y = (A*10^\frac{n}{2}+B) (C*10^\frac{n}{2}+D) \\ = A*C*10^n + A*D*10^\frac{n}{2}+B*C*10^\frac{n}{2}+B*D XY=(A102n+B)(C102n+D)=AC10n+AD102n+BC102n+BD

而AC, AD,BC,BD再通过分治法求解,乘以10的幂相当于移位操作。所以需要调用四次分治乘法函数,所以时间复杂度为:
T ( n ) = 4 ∗ T ( n 2 ) + θ ( n ) T(n) = 4*T(\frac{n}{2})+\theta (n) T(n)=4T(2n)+θ(n)

通过master定理可得 T ( n ) = O ( n 2 ) T(n)=O (n^2) T(n)=O(n2)

通过化简上述公式得

X ∗ Y = A ∗ C ∗ 1 0 n + ( A ∗ D + B ∗ C ∗ ) 1 0 n 2 + B ∗ D = A ∗ C ∗ 1 0 n + ( ( A − B ) ∗ ( D − C ) + A ∗ C + B ∗ D ) ∗ 1 0 n 2 + B ∗ D X*Y = A*C*10^n + (A*D+B*C*)10^\frac{n}{2}+B*D\\ = A*C*10^n + ((A-B)*(D-C)+A*C+B*D)*10^\frac{n}{2}+B*D XY=AC10n+(AD+BC)102n+BD=AC10n+((AB)(DC)+AC+BD)102n+BD

可知只需要对AC,DB, (A-B)*(D-C)再通过分治法求解, 所以只需要调用三次分治乘法函数即可,所以时间复杂度为:

T ( n ) = 3 ∗ T ( n 2 ) + θ ( n ) T(n) = 3*T(\frac{n}{2})+\theta (n) T(n)=3T(2n)+θ(n)

通过master定理可得 T ( n ) = O ( n l o g 2 3 ) T(n)=O (n^{{log_23}}) T(n)=O(nlog23)

参考

分治法的经典问题——大整数相乘
【算法】大数乘法问题及其高效算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值