[英]What will be the time complexity of this algorithm?
以下代码/算法的时间复杂度是多少? 不应该是 O(a^2) 吗? 我的老师说不,我需要更加努力地思考并专注于给定的限制。 有人可以帮我吗?
function(int a, int b)
{
for(i=0; i<a; i++)
{
for(j=0; j<a-i; j++)
{
k = a-i-j;
if(8*i+4*j+2*k == b)
return;
}
}
}
约束:
2 a < b < 8 a
b 总是偶数
代码会在找到 i, j 使得 8i+4j+2(aij)=b,即 6i+2j=b-2a 时提前停止。
j 循环从 0 到 ai,因此要使 j 在范围内,有 b-2a = 6i+2j < 6i+2(ai) = 4i+2a,即 4i > b-4a。
所以在我们有机会找到 j 之前,我们需要执行 i 循环的 (b-4a)/4 次迭代。
我会跳过细节,但是可以检查 a>=6 总是有 aj ,这样当 i 是第一个至少为 (b-4a)/4 的值时循环退出(假设 b 是偶数并且 2a< b<8a)。
计算迭代次数(并将内部循环计算为总是 a 迭代而不是 ai 迭代,这在最坏的情况下会产生 2 倍的误差),我们得到 a*max(1, b/4-a) 迭代的界限。
我在这里浏览了很多细节,但结果是复杂度是 Theta(a*max(1, b/4-a))。
在给定的约束条件下,假设您对最坏情况的复杂性感兴趣,它仍然是 O(a²)。 也许缺少另一个约束?
保罗的回答很好,并准确地说明了复杂性。 但是,要找到最坏情况的复杂性,您可以只展示最坏的情况。
方程 8i+4j+2k = b 重写为3i+j = b/2−a 。 因为 j < a-i,所以左侧最多为 3i+(a-i-1),即 2i+a-1。 因为 i < a,所以最多为 2(a-1)+a-1,即 3a-3。
取最大可能的 b:b = 8a−2(同时满足两个约束:b 是偶数且 2a < b < 8a)。 等式的右侧变为 (8a-2)/2-a,即 3a-1。 这严格大于 3a-3,因此方程无解。 在这种情况下,算法会尝试所有 (i,j),这是二次的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.