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

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

算法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
}

该算法用于确定数组是否至少包含一个在数组中发生三次或更多。我的工作是找出这个数组最坏的情况,以及它的时间复杂性。

我的想法是,最糟糕的情况是,如果算法在每个条目中出现两次(如果数组中元素的数目为奇数,则额外条目是唯一的)。在这种情况下,每次通过数组时,for (int j = 0; j < anArray.length; j++)中的if语句总是被违反两次,强制执行两次计算,但在检查完每个元素之后,算法才真正终止。我在想,这将有一个时间复杂的O(n^2)

有人能提供这个的任何见解吗?因为我一直怀疑自己是错的,如果我是错的,我想找出正确的答案,以及为什么是正确的。


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


如果我们说的是纯粹的运行时间,那么当if语句条件为真时(然后您还需要担心分支预测之类的事情),但是

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

无论if语句条件是否为真,都需要O(1)时间。因此,对于运行时间的复杂性,整个函数需要O(n2)。在任何情况下,如果没有出现3次,或者出现3次或更多次的元素的第一次出现接近结尾("接近结尾"实际上可能不太近,但让我们将其留到另一天)。