【问题标题】:How to know the time and space complexity of the following snapshot?如何知道以下快照的时间和空间复杂度?
【发布时间】:2016-05-15 23:48:40
【问题描述】:

我了解以下快照中的代码是如何工作的,但我很好奇如何知道它的时间和空间复杂度?

我知道这取决于“b”变为零所需的时间。有什么数学方法可以找到这个吗? 我知道这永远不会进入数百万次递归。但还是很好奇会发生多少次递归?

问题: 在不使用任何算术运算的情况下添加 2 个数字 -

【问题讨论】:

  • 如果您花时间输入并格式化您关心的代码部分而不是张贴图片,这个问题会更好。图片的可读性较差,如果人们想自己运行,也无法复制和粘贴

标签: algorithm time-complexity space-complexity


【解决方案1】:

由于进位是 a&b 左移,它的位 0(最低有效位或 LSB)为零。此外,进位在每个位置 p 都为零,其中 b 在位置 p-1 为零。这意味着在第一次递归调用中,b 的第 0 位为零,而在第二次递归调用中,第 0 位和第 1 位中的 b 为零(2 个 LSB 为零),依此类推。在第 n 次递归调用中,b 将有 n 个 LSB 为 0,因此当 n 是 a 中最高有效非零位的位置时,进位将为零,递归将在下一次调用中结束。

所以时间复杂度为 O(n),其中 n 是 a 中的位数(更准确地说,是 a 中最高有效非零位的位置,在最坏的情况下是位数在一个)。空间复杂度也是O(n),因为有n次递归调用,但是由于这是尾递归,所以可以优化掉,所以优化后的空间复杂度是O(1)。

【讨论】:

    【解决方案2】:

    它就像一个波纹进位加法器(但它神奇地“知道”输出何时稳定并提前退出)。每一步,进位将严格增加最低设置位的位置(如果没有最低设置位,则为无穷大)。所以它对于每一位最多可以递归一次。代表多少时间/空间取决于您的假设(将位数作为常数会产生无用的结果,从而阻止您将其与替代实现进行比较)。

    这显然是一个尾调用,它可以被重写为一个循环,所以你可以说它占用的空间比你假装它实际使用了所有堆栈空间要少。

    此外,还可以通过位数对数的多个步骤来完成此操作,类似于 Kogge-Stone 加法器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2013-09-12
      • 1970-01-01
      • 2016-02-13
      相关资源
      最近更新 更多