我有这个功能
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)。
答案 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/2
,n/2+1
...... n
。
循环将完全迭代n-n/2+1
= n/2+1 (+parity)
,因此算法复杂度为O(n / 2)= O(n)。