【问题标题】:finding/verifying big O notation of recursive function查找/验证递归函数的大 O 表示法
【发布时间】:2023-11-29 17:44:02
【问题描述】:

功能

函数乘法(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(n2) 时间。

这样对吗?

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

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

【问题讨论】:

    标签: recursion big-o


    【解决方案1】:

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

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

    【讨论】: