这是算法:
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)
的时间复杂度。
任何人都可以对此提供任何见解吗?因为我怀疑我是不正确的,如果我是,我想找出正确的答案以及为什么它是正确的。
答案 0 :(得分:2)
最坏的情况是O(N ^ 2),当你找不到三元组时会发生这种情况。
答案 1 :(得分:1)
如果我们谈论的是纯粹的运行时间,那么当if语句条件为真时就会发挥作用(然后你还要担心像分支预测这样的事情),但是
if (anArray[i] == anArray[j]) {
count++;
}
无论if语句条件是否为真,都需要O(1)时间。因此,对于运行时间复杂度,整个函数将采用O(n 2 )。这种情况会发生在任何情况下,如果没有3次出现,或者出现3次或更多次的元素的第一次出现接近结束('接近结束'可能实际上不是那么近,但让我们留给另一次天)。