【发布时间】:2014-02-02 20:51:21
【问题描述】:
算法如下:
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²)。最坏的情况会发生,例如当您的数据具有唯一值时,除了最后 3 个相同的元素。
-
@Alexandru Barbarosie 我也在考虑最后三个元素是否相同,但是当它到达倒数第二个条目而不是搜索所有条目时,该方法将返回“true”。这是不正确的想法吗?
-
顺便说一句,您可以在 O(n) 最坏情况下执行此操作,方法是迭代一次,然后对您迄今为止看到的所有数字进行(散列)计数器。
-
@RAF1940 不过仍然会是 O(n^2)(是的,如果一直出现 2 次会稍微更糟)。
-
@RAF1940 O(n²) - O(1) = O(n²)(其中 O(1) 是您最后一次计算的常数时间)
标签: java arrays algorithm big-o time-complexity