如何知道以下快照的时间和空间复杂度?

时间:2016-02-05 21:16:27

标签: algorithm time-complexity space-complexity

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

我知道这取决于' b'成为零。我能找到一些数学方法吗? 据我所知,这不会进入数百万次递归。但是仍然很想知道会发生多少次递归?

问题: 添加2个数字而不使用任何算术运算 - enter image description here

2 个答案:

答案 0 :(得分:0)

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

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

此外,可以通过多个步骤以对数方式执行此操作,类似于Kogge-Stone加法器。

答案 1 :(得分:0)

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

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