C 这个算法的时间复杂度更准确的是什么?
这是我的节目:C 这个算法的时间复杂度更准确的是什么?,c,algorithm,time-complexity,big-o,C,Algorithm,Time Complexity,Big O,这是我的节目: for(m!=n){ if(m>n) m=m-n; else n=n-m; } 如果我取m=16,n=2,那么循环执行7次。 如果我取m=16,n=12,那么循环执行3次。 如何为该程序提供更准确的时间复杂度,以及计算这种类型算法(其中我们有两个输入)的时间复杂度的过程是什么?假设m,n>0,时间复杂度是O(max(n,m))(或者,等效地,O(n+m)) 理由是: 在每次迭代中,n减少,或者m减少,因此迭代次数不能超过n+m(上
for(m!=n){
if(m>n)
m=m-n;
else
n=n-m;
}
如果我取m=16,n=2,那么循环执行7次。
如果我取m=16,n=12,那么循环执行3次。
如何为该程序提供更准确的时间复杂度,以及计算这种类型算法(其中我们有两个输入)的时间复杂度的过程是什么?假设
m,n>0
,时间复杂度是O(max(n,m))
(或者,等效地,O(n+m)
)
理由是:
- 在每次迭代中,
减少,或者n
减少,因此迭代次数不能超过m
(上限)n+m
- 我们可以给出一个最坏情况的场景
,n=1
(并且,对称地,m=k
,n=k
),它精确地给出了m=1
迭代(下限)k
- 假设你的m和n遵循一定的约束,循环不会进入无限循环。即
m>0
和n>0
或m=1
和n=0
如果m>=n
如果m%n==0,则循环将执行m/n-1次
如果m%n=0
则循环将执行ceil(m/n)次
如果m对于时间复杂度没有明确的答案。迭代次数取决于m和n
如果m==n,则循环在1步中退出李>
如果m==1和n==100,循环将执行100步李>
所以,如果你保持n不变,继续增加m,你会得到一个循环模式
下图显示了n=2000和m的迭代次数,范围为1到10000
你没有证据证明循环会结束
特别是如果m或n中的任何一个为零,它将永远循环
因此,时间复杂性是不确定的
添加约束
希望这能有所帮助。对于m=1
和n=0
来说,时间复杂度似乎是无限的,所以如果不指定更多的约束,那么很难回答。Big-O通常只适用于可以被证明是终止的算法。不要接受无效的输入,就像我想计算非常大的输入的时间复杂度(就像我们通常做的那样)比如n和mIf在任何情况下,某些代码不终止,其复杂度是不确定的。说“忽略无效输入”并不能改变这一点。如果m
和n
是有符号整数类型,并且有相反的符号(例如,一个是正的,另一个是负的),则循环也将有未定义的行为。我投票结束这个问题,因为它正在寻找答案,而答案是不确定的。o(m/n)
可以等于o(n)
?@deniss这句话正确吗?这看起来很奇怪,因为我们不能说O(1/n)等于O(n)没有不同meanings@newby,O(n/m)
在O(n)
(对于n,m>=1
)中,与O(n)
在O(n^2)
中的含义相同,但我认为该算法不是O(n/m)
。反例是n=k,m=k+1
,它在第一次迭代后被减少为n=k,m=1
,并循环k+1
总迭代次数。
If m<n