C++ 当我计算这个迭代函数并给出O(n^3)时,它是怎样的O(n/2)

C++ 当我计算这个迭代函数并给出O(n^3)时,它是怎样的O(n/2),c++,algorithm,C++,Algorithm,我有这个功能 void A() { for(int i=n/2;i<=n;i++) printf("XXX"); } 我试着用下面的逻辑计算它的复杂度,但我知道它是错误的,正确的值是开/2,根据: i值最初以i=n/2开始;那么i=n/2+1;然后i=n/2+2;>>>i=n/2+n 这将导致执行总数n/2*1+2+3+4+n 这将是n^2定义,因此其值为On^3 i值最初以i=n/2开始;那么i=n/2+1;那么i=n/2+2; i=n/2+n 最终值是i=n/

我有这个功能

void A()
{
    for(int i=n/2;i<=n;i++)
        printf("XXX");
}
我试着用下面的逻辑计算它的复杂度,但我知道它是错误的,正确的值是开/2,根据:

i值最初以i=n/2开始;那么i=n/2+1;然后i=n/2+2;>>>i=n/2+n

这将导致执行总数n/2*1+2+3+4+n 这将是n^2定义,因此其值为On^3

i值最初以i=n/2开始;那么i=n/2+1;那么i=n/2+2; i=n/2+n


最终值是i=n/2+n/2=n,而不是您假设的n/2+n;因此,推断操作总数是非常容易的:end-start+1,即n-n/2+1=n/2+1,这是一个打开的。

这实际上是一个简单的例子,因为我们确切地知道for循环将根据n计算多少次迭代:我将依次取n/2,n/2+1。。。n


循环将精确迭代n-n/2+1=n/2+1+奇偶校验,因此算法复杂性为On/2=On。

n既不声明也不初始化;什么是n?代码的运行时是开/2的,因为for循环在n/2到n之间的n/2范围内迭代。我不理解你的推理。我从n/2到n,这是n/2次迭代,给定或取1,所以复杂度为/2,也就是说@Timo我知道它是/2,但我分析循环失败了算术级数1+2+…+n的和是n-1*n/2~n^2。乘以n/2得到n^3也就是说,如果运行时边界是多对数的,通常会忽略常数因子,即On/2=On。@Codor同意,这就是我首先提到的原因。