查找/验证递归函数的大O表示法

时间:2015-09-23 17:30:10

标签: recursion big-o

功能

函数乘法(x,y)
如果y = 0:
返回0
z =乘(x,⎣y/2⎦)
如果y是偶数:
返回2z
其他:
返回x + 2z

问题

“如果输入是m位数x和n位数y,那么乘以x和y需要多长时间?”

我的逻辑

需要 n 递归调用才能获得基本情况*。退出每个函数调用需要 n 步骤,并执行2z或x + 2z。

因此,需要O(n 2 )时间。

这是对的吗?

有人告诉我应该是O(mn),但我不相信。如果我错了,请解释原因。

*因为它将y重复除以2直到达到基本情况,递归调用的数量基于y值的最接近2的幂。由于二进制只是2的幂的位,所以y的n位等于递归调用的数量。

1 个答案:

答案 0 :(得分:1)

有些情况下,您始终会执行' x + 2z'在任何递归调用中,除了最后一种情况(当y为0时)。例如,乘以(5,31)等。 所以我认为主要的是' +'操作。当数字非常大时,执行添加不需要1个机器步骤。因此,我们必须计算我们必须花费多少机器步骤才能将x数(m位长)添加到另一个。结果是O(m)步。 这就是为什么答案是O(mn)。

P.S。 ' 2Z'将采用静态步数,因为我们可以在数字末尾添加0并获得结果。想象一下,这个数字非常大,我们将每一位存储为数组元素。所以我们可以将0推到数组的末尾,我们将得到操作的结果' 2z'。