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

How this iterative function is O(n/2) when I calculate it and gives me O(n^3)

本文关键字:函数 迭代 计算      更新时间:2023-10-16

我有这个函数

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

我尝试使用以下逻辑计算它的复杂性(但我知道这是错误的,根据教程 24:30,正确的值是 O(n/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 定义,因此它的值为 O(n^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,这是O(n)

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

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