[英]What would be the worst case time complexity for this algorithm?
这是算法:
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;
}
该算法旨在确定数组是否包含至少一个在数组中出现3次或更多的数字。 我的工作是弄清楚此阵列最坏的情况及其时间复杂度。
我的想法是,最坏的情况是该算法的每个条目都有两次出现(如果数组的元素数量为奇数,则额外条目是唯一的)。 在这种情况下,每次通过数组时, for (int j = 0; j < anArray.length; j++)
的if
语句始终会被违反两次,从而迫使计算执行两次,但是该算法实际上并未终止直到检查完每个元素。 我以为这将具有O(n^2)
的时间复杂度。
谁能提供对此的任何见解? 因为我一直在怀疑自己是不正确的,如果我是我,我想找出正确的答案以及正确的原因。
最坏的情况是O(N ^ 2),当您找不到三元组时就会发生这种情况。
如果我们在谈论纯运行时间,那么当if语句条件为true时就会起作用(然后您还必须担心分支预测之类的事情),但是
if (anArray[i] == anArray[j]) {
count++;
}
无论if陈述条件为真,都要花费O(1)时间。 因此,对于运行时间复杂度 ,整个函数将采用O(n 2 )。 在任何情况下都不会发生,或者没有3次出现,或者元素出现3次或更多次的第一次出现在末尾附近(“ near the end”实际上可能不是那么近,但是让我们将其留给另一个天)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.