这个算法的最坏情况时间复杂度是多少?

时间:2014-02-02 20:51:22

标签: java arrays algorithm big-o time-complexity

这是算法:

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;
}

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

我的想法是,最糟糕的情况是,如果算法每次输入两次出现(如果数组具有奇数个元素,则额外输入是唯一的)。在这种情况下,if中的for (int j = 0; j < anArray.length; j++)语句在每次通过数组时总是被违反两次,强制计算执行两次,但算法实际上不会终止,直到它检查了每个元素。我当时认为这会有O(n^2)的时间复杂度。

任何人都可以对此提供任何见解吗?因为我怀疑我是不正确的,如果我是,我想找出正确的答案以及为什么它是正确的。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果我们谈论的是纯粹的运行时间,那么当if语句条件为真时就会发挥作用(然后你还要担心像分支预测这样的事情),但是

if (anArray[i] == anArray[j]) { 
    count++; 
}
无论if语句条件是否为真,

都需要O(1)时间。因此,对于运行时间复杂度,整个函数将采用O(n 2 )。这种情况会发生在任何情况下,如果没有3次出现,或者出现3次或更多次的元素的第一次出现接近结束('接近结束'可能实际上不是那么近,但让我们留给另一次天)。