繁体   English   中英

此算法在最坏情况下的时间复杂度是多少?

[英]What would be the worst case time complexity for this algorithm?

这是算法:

boolean findTripleA(int[] anArray) { 
    if (anArray.length <= 2) { 
        return false; 
    } 

    for (int i=0; i < anArray.length; i++) { 
        // check if anArray[i] occurs at least three times 
        // by counting how often it occurs in anArray 

        int count = 0; 

        for (int j = 0; j < anArray.length; j++) { 
            if (anArray[i] == anArray[j]) { 
                count++; 
            } 
        } 

        if (count >= 3) { 
            return true; 
        } 
    } 

    return false;
}

该算法旨在确定数组是否包含至少一个在数组中出现3次或更多的数字。 我的工作是弄清楚此阵列最坏的情况及其时间复杂度。

我的想法是,最坏的情况是该算法的每个条目都有两次出现(如果数组的元素数量为奇数,则额外条目是唯一的)。 在这种情况下,每次通过数组时, for (int j = 0; j < anArray.length; j++)if语句始终会被违反两次,从而迫使计算执行两次,但是该算法实际上并未终止直到检查完每个元素。 我以为这将具有O(n^2)的时间复杂度。

谁能提供对此的任何见解? 因为我一直在怀疑自己是不正确的,如果我是我,我想找出正确的答案以及正确的原因。

最坏的情况是O(N ^ 2),当您找不到三元组时就会发生这种情况。

如果我们在谈论纯运行时间,那么当if语句条件为true时就会起作用(然后您还必须担心分支预测之类的事情),但是

if (anArray[i] == anArray[j]) { 
    count++; 
}

无论if陈述条件为真,都要花费O(1)时间。 因此,对于运行时间复杂度 ,整个函数将采用O(n 2 )。 在任何情况下都不会发生,或者没有3次出现,或者元素出现3次或更多次的第一次出现在末尾附近(“ near the end”实际上可能不是那么近,但是让我们将其留给另一个天)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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