前几天我的任务中有这个问题,但我仍然不确定我是否正确。
for(int i =1; i <n; i++) //n is some size
{
for(j=1; j<i; j++)
{
int k=1;
while (k<n)
{
k=k+C; //where C is a constant and >=2
}
}
}
我知道嵌套for循环是O(n ^ 2)但我不确定while循环。我假设整个代码都是O(n ^ 3)。
答案 0 :(得分:2)
int k=1;
while (k<n){
k=k+C //where C is a constant and >=2
}
这将采取(n-1)/C
步骤:写u =(k-1)/ C.然后,k = Cu + 1,语句变为
u=0;
while(u < (n-1)/C) {
u=u+1
}
因此while循环是O(n)
(因为C
是常数)
从虚拟变量u
开始。循环
u=0;
while(u < MAX) {
u = u+1
}
运行MAX
次。
当你放MAX = (n-1) / C
时,循环是
u=0;
while(u < (n-1)/C) {
u=u+1
}
这会运行(n-1)/C
次。
现在,支票u < (n-1)/C
相当于C*u < n-1
或C*u + 1 < n
,因此循环相当于
u=0;
while(C*u + 1 < n) {
u=u+1
}
现在,假设我们根据变量k = C * u + 1
重写了这个循环。然后,
u=0;
k=1; // C * 0 + 1 = 1
循环看起来像
while(C*u + 1 < n) {
while(k < n) {
,内在条件是
u=u+1
k=k+C //C * (u+1) + 1 = C * u + 1 + C = old_k + C
全部放在一起:
int k=1;
while (k<n){
k=k+C
}
需要(n-1)/C
步。
答案 1 :(得分:2)
内部循环字面上是O(n/C)=O(n)
,所以是的,总的来说是O(n^3)
(第二个循环的上限为O(n)
)
答案 2 :(得分:1)
正式地,您可以继续使用以下方法(Sigma Notation):
其中a
表示最内层循环内的常量操作数(a = 1
,如果要计算确切的迭代次数)。
答案 3 :(得分:0)
好吧,您需要查看为给定的n和C值运行while循环体的次数。例如,n为10,C为3.主体将运行3次:k = 1, k = 4,k = 7.对于n = 100且C = 2,主体将运行50次:k = 1,3,5,7,9,...,91,93,95,97,99。这是一个由C计数到n的问题。您应该能够从该线索计算Big-O复杂性。