繁体   English   中英

这个算法的时间复杂度是多少?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM