我想知道以下两种算法的时间复杂度
void main (){-----------------------------------------T(n)
for(int a=1 ; a<=20 ; a++) {------------?
if(a%2==0) -------------?
cout<<"value is Even"; --------?
else
cout<<"value is Odd";--------?
}
}
void main (){-----------------------------------------T(n)
int x=1; {------------?
int a=1; -------------?
while(a<=n){--------?
x=x*a; -------------?
a=a+2; -------------?
}
cout<<x;
}
答案 0 :(得分:2)
这个想法是计算一段代码的执行时间 - 通常是一些算法 - 取决于输入。如果函数将N作为输入,则在N = 5或N = 10时执行需要多长时间。它会花费多长时间吗?这需要同一时间吗?还是需要两倍以上?
在你的情况下:
第一个程序不依赖于任何输入,因此它是O(n)= 1。
你的第二个程序取决于n。由于a = a + 2,它会做n / 2次相同的事情。所以它是O(n)= n / 2。但是通常会跳过常量,并且会写出O(n)= n。
如果你有这样的代码:
for (a=0; a < n; a++)
{
// n times here
for (b=0; b<n; b++)
{
// n times here
// do something
}
}
执行时间将变为n ^ 2,因为两个循环将迭代n次。每次外循环执行时,内循环执行n次。由于外循环执行n次,因此你有n * n。所以O(n)= n ^ 2
答案 1 :(得分:1)
您需要添加正在执行的基本操作 / 机器说明。 (作为其输入大小的函数)
void main ()
{
for(int a=1 ; a<=20 ; a++)
| | |
c1 c2 c3
{
if(a%2==0) --c4 (the cost of whole if-else construct)
cout<<"value is Even";
else
cout<<"value is Odd";
}
}
c1,c2,c3,c4是执行与这些结构相对应的机器指令的成本(如&lt; = 20等)
Look carefully the cost is
= c1+ c2*(20+1) + c3*20+c4*20;
= c1+21*c2+20*c3+20*c4
= constant.
So, T(n)=O(1)
为什么20 + 1?哦!这是因为实际上a=21
的最后一次检查。
对于此代码,请同样检查
void main ()
{
int x=1;--c1
int a=1;--c2
while(a<=n)--c3
{
x=x*a; --c4
a=a+2; --c5
}
cout<<x; --c6
}
现在费用是= c1 + c2 + c3 *(n + 1)+ n *(c4 + c5)+ c6 = n *(c3 + c4 + c5)+(c1 + c2 + c3 + c6) = A * n + B(A =常数,因此是B)
所以T(n)= O(n)。
请记住,我们只对恒定因素的表现感兴趣。这就是我们忽略A,B等常数的原因。我们可以用常数因子对它们进行乘法或除法,以得到更简单的形式。