Java 这个算法最坏的时间复杂度是什么?

Java 这个算法最坏的时间复杂度是什么?,java,arrays,algorithm,big-o,time-complexity,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 oft

以下是算法:

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;
}
布尔findTripleA(int[]anArray){
如果(anArray.length=3){
返回true;
} 
} 
返回false;
}
该算法旨在确定数组是否包含至少一个 在数组中发生三次或更多次。我的工作是找出此阵列的最坏情况及其时间复杂性

我的想法是,最坏的情况是,如果算法的每个条目都出现两次(如果数组的元素数为奇数,则额外的条目是唯一的)。在这种情况下,
for(int j=0;j
中的
if
语句在数组的每次传递中总是违反两次,强制执行两次计算,但在检查完每个元素之前,算法实际上不会终止。我认为这将具有时间复杂度
O(n^2)


有人能对此提供一些见解吗?因为我一直怀疑我是错的,如果我是错的,我想找出正确的答案,以及为什么它是正确的。

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

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


无论if语句条件是否为true,都需要O(1)个时间。因此,对于运行时间复杂性,整个函数将需要O(n2)。如果没有3次出现,或者一个元素出现3次或更多次的第一次出现接近结尾,则会发生这种情况(“接近尾声”可能并不那么近,但让我们再等一天吧)。

是的,是O(n²)。最坏的情况会发生,例如,当您的数据有唯一的值时,除了最后三个相同的元素。@Alexandru Barbarosie我也在考虑最后三个元素是否相同,但是当方法到达倒数第二个条目时,它会返回“true”,而不是搜索所有条目。这是错误的想法吗?顺便说一句在O(n)最坏的情况下,您可以通过迭代一次并对迄今为止看到的所有数字生成一个(散列)计数器来实现这一点。@RAF1940虽然仍然是O(n^2)(是的,一路出现两次会稍微差一点)。@RAF1940 O(n²)-O(1)=O(n²)(其中O(1)是您最后一次计算的恒定时间)那么if语句被违反多少次是不相关的?@RAF1940是的,它仍然被使用了一定的次数。我不确定你怎么能违反if语句……无论如何,你在外循环中遍历整个数组,然后在内循环中再次遍历,除非你达到计数>=3。
if (anArray[i] == anArray[j]) { 
    count++; 
}