当我计算它并给出O(n ^ 3)时,这个迭代函数如何是O(n / 2)

时间:2017-02-24 12:18:38

标签: c++ algorithm

我有这个功能

void A()
{
    for(int i=n/2;i<=n;i++)
        printf("XXX");
}

我尝试使用以下逻辑计算它的复杂性(但我知道这是错误的,根据tutorial 24:30,正确的值是O(n / 2)):

  

我的值最初以i = n / 2开头;那么i =(n / 2)+1;那么i =(n / 2)+2; &GT;&GT;&GT;&GT; I =(N / 2)+ N

这将导致执行总数n / 2 *(1 + 2 + 3 + 4 + .... + n) 这将是n ^ 2定义,因此它将具有值O(n ^ 3)。

2 个答案:

答案 0 :(得分:4)

  

我的值最初以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,即O(n)

答案 1 :(得分:1)

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

循环将完全迭代n-n/2+1 = n/2+1 (+parity),因此算法复杂度为O(n / 2)= O(n)。