为什么这个循环需要O(2 ^ n)时间复杂度?

时间:2017-08-06 22:04:35

标签: algorithm time-complexity

有一个循环执行强力算法来计算5 * 3而不使用算术运算符。

我只需要添加5次,这样如果输入为x * y,则需要O(3)为O(y)。 但是,在一本书中,它表示需要O(2 ^ n),其中n是输入中的位数。我不明白为什么用O(2 ^ n)代表O(y)。这是展示时间复杂性的更好方法吗?你能解释一下吗?

我没有要求其他算法来计算这个。

int result = 0
for(int i=0; i<3; i++){
    result += 5
}

3 个答案:

答案 0 :(得分:3)

你声称时间复杂度是输入上的O(y),并且本书声称输入中的位数时间复杂度为O(2 n ) 。好消息:你说得对!如果数字y可以用n位表示,则y最多为2 n - 1。

答案 1 :(得分:1)

我认为你误读了这本书中的段落。

当本书讨论计算两个数的乘积的算法时,它使用乘以3×5的例子作为通过添加y + y +来计算x×y的更一般概念的具体实例。 。+ y,x总时间。它没有声称特定算法“添加5 + 5 + 5”在时间O(2 n )中运行。相反,请考虑这个算法:

int total = 0;
for (int i = 0; i < x; i++) {
    total += y;
}

该算法的运行时为O(x)。如果你根据数字x中的位数n来测量运行时间 - 如书中所建议的那样 - 那么运行时间是O(2 n ),因为要代表数字x你需要O(log n)位。这是polynomial time and pseudopolynomial time之间的区别,然后本书继续描述用于解决此问题的更好算法的原因是运行时最终成为用于表示该问题的位数的多项式在数字的数值中输入而不是。关于小学 - 学校乘法和加法的论述可以帮助你更好地理解这两个数量之间的差异。

答案 2 :(得分:0)

不要想到3和5.想想如何计算20亿x 20亿(大约2 ^ 31乘以2 ^ 31)

您的输入为31位(N),您的循环将执行20亿次,即2 ^ N.

所以,书是正确的。对于5x3情况,3是2位。所以它的复杂性是O(2 ^ 2)。再说一遍。