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; } |
该算法用于确定数组是否至少包含一个在数组中发生三次或更多。我的工作是找出这个数组最坏的情况,以及它的时间复杂性。
我的想法是,最糟糕的情况是,如果算法在每个条目中出现两次(如果数组中元素的数目为奇数,则额外条目是唯一的)。在这种情况下,每次通过数组时,
有人能提供这个的任何见解吗?因为我一直怀疑自己是错的,如果我是错的,我想找出正确的答案,以及为什么是正确的。
最坏的情况是O(n^2),当你找不到三联体时就会发生。
如果我们说的是纯粹的运行时间,那么当if语句条件为真时(然后您还需要担心分支预测之类的事情),但是
1 2 3 | if (anArray[i] == anArray[j]) { count++; } |
无论if语句条件是否为真,都需要O(1)时间。因此,对于运行时间的复杂性,整个函数需要O(n2)。在任何情况下,如果没有出现3次,或者出现3次或更多次的元素的第一次出现接近结尾("接近结尾"实际上可能不太近,但让我们将其留到另一天)。