如何解决此乘法算法的递归关系

时间:2018-09-23 01:56:45

标签: algorithm recursion time-complexity multiplication recurrence

如何在函数调用自身的次数上建立big-O上限,作为以下b的函数:

  function multiply(a,b)
     if b = 0 then return 0
     else if b is even then
       t := multiply(a, b/2);
       return t+t;
     else if b is odd then
       t := multiply(a, b-1);
       return a+t;

这是一个将两个整数相乘的函数。我对如何处理递归关系的if else条件感到困惑。我以为答案是T(n)= T(n / 2)+ T(n-1)。正确吗?

2 个答案:

答案 0 :(得分:2)

 function multiply(a,b)
     if b = 0 then return 0
     else if b is even then
       t := multiply(a, b/2);
       return t+t;
     else if b is odd then
       t := multiply(a, b-1);
       return a+t;

因此:

F(0) = 0
If Even: F(N) = F(N/2) + 1 
If Odd-Even: F(N) = F(N-1) + 1 = F((N-1)/2) + 2 <-next number is definitely even

解决奇偶双数情况(最坏的情况):

F(N) = F((N-1)/2) + 2 = O(LogN)

思考问题的另一种方式是,我们知道奇偶奇数情况的深度最多是偶偶偶数情况的两倍。偶数情况的深度为LogN,因此奇偶数情况的深度为2*LogN

答案 1 :(得分:0)

赞赏以下两点:

  • odd 输入呼叫multiply会触发对相同输入减一个(偶数)的调用。这将需要再打一个电话才能达到偶数。
  • 使用偶数输入呼叫multiply将触发另一次输入减半的呼叫。结果数将是q.v的偶数或奇数。以上几点。

在最坏的情况下,从偶数输入开始,将需要两次 调用,以将传递给multiply的输入减半。此行为与2*O(lgN)的运行时间(其中lg是基于日志的2)一致。这和O(lgN)一样。