当前位置: 首页 > 知识库问答 >
问题:

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

红经亘
2023-03-14

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

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

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

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

共有3个答案

郜振国
2023-03-14

不要用3和5思考。想想如何计算20亿x20亿(大致2^31乘以2^31)

每个输入为31位(N),循环将执行20亿次,即2^N。

所以,book是正确的。对于5x3的情况,3是2位。所以复杂度是O(2^2)。再次正确。

隆扬
2023-03-14

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

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

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

该算法的运行时是O(x)。如果您将运行时度量为数字x中位数n的函数——正如这本书所建议的那样——那么运行时是O(2n),因为要表示数字x,您需要O(log n)位。这是多项式时间和伪多项式时间之间的区别,这本书接着描述了解决这个问题的更好算法的原因是,运行时最终是用于表示输入的位数的多项式,而不是数字的数值。关于小学乘法和加法的阐述是为了帮助你更好地理解这两个量之间的区别。

戚阳
2023-03-14

你声称输入的时间复杂度是O(y),这本书声称输入的位数的时间复杂度是O(2)。好消息:你们都是对的!如果数字y可以由n位表示,则y最多为2n− 1.

 类似资料:
  • 我试图为这段代码找出一个大O的紧密界限: 如果我们从内最循环开始,它将在最坏的情况下运行k=n^2次,占O(N^2)。如果语句每次j=m*i时都为真,其中m是一个任意常数。由于j从1运行到i^2,这将在m={1,2,...,i}时发生,这意味着它将在i次时为真,i最多可以是n,所以最坏的情况将是m={1,2,...,n}=n次。如果i=n,第二个循环应该有O(N^2)的最坏情况。外环具有O(N)的

  • 考虑这个简单的C++函数来计算数组的前缀和: 它是4个融合的UOP1,这个CPU可以支持4个融合的OPs/周期。 有通过和携带的依赖链,每个都是一个循环,但是这些UOP可以到4个ALU端口中的任何一个,所以似乎不太可能冲突。融合的需要转到p6,这是一个更令人担忧的问题,但我只测量到p6的1.1 UOPS/迭代。这将解释每次迭代1.1个循环,但不是1.4个循环。如果我将循环展开2倍,端口压力会低得多

  • 如果我通过两个嵌套的For循环进行输入 外环的复杂度是O(X),但是我对内环的时间复杂度感到困惑,因为Y是可变的。

  • 问题内容: 我刚刚开始学习数据结构,并且在进行数组插入时想知道为什么数组插入的时间复杂度为O(n)而不是O(n + 1)? 在最佳情况下,当插入在最后时,时间复杂度为O(1)。我想我们正在考虑1插入元素,因为这里没有元素被移动。在最坏的情况下,假设我们必须移动n个元素然后插入新元素,那么时间时间复杂度是否应该为O(n + 1)?n用于移动元素,1用于插入。 非常感谢您的帮助。 问题答案: O(n)

  • 以下代码的时间复杂度是多少? 在嵌套循环中,如果外循环1需要O(1)时间,内循环2需要O(logn)时间,内循环3需要O(n)。那么总的tc是O(1)O(logn)O(n)=O(nlogn)。这是真的吗? 请解释一下。

  • 问题内容: 来自redis doc: ZPOPMIN键[count]自5.0.0起可用。 时间复杂度:O(log(N)* M),其中N为排序集中元素的数量,M为弹出元素的数量。 删除并返回存储在key排序集中的得分最低的成员。 因此,我的问题是,如果列表已排序,为什么要使用log n,为什么不使用O(1)? 问题答案: 如果 列表 已排序,为什么要使用log n,为什么不使用O(1)? 如果使用列