我正在寻找最佳算法来在数组中找到一个元素,该元素至少大于数组中元素的一半。它应该大于o(n) 假设没有重复。我的意思是小于o(n)。注意:如果不可能,假设我有n个proccesors
答案 0 :(得分:4)
比较第一个和最后一个元素。返回更大的一个。 O(1)
我认为Philipp采用的方法是正确的,但只需进行一些调整。
首先,您需要跟踪“最大”元素的出现次数,然后至少读取该数字的一半。
这导致了检查n/2 + 1
的最佳情况,以及检查n
元素的最坏情况。因此,它是O(n)
在伪代码中:
int findElement(int* array, num_elements) {
int max = -1 * INT_MAX;
int times = 0;
for (int i = 0; i <= ( num_elements / 2 + times) && i < num_elements; i++) {
if (array[i] > max) {
max = array[i];
times = 1;
} else if (array[i] == max) {
times++;
}
}
return max;
}
答案 1 :(得分:3)
如果没有排序:
你不能比O(n)
做得更好,因为任何一个元素都可以,所以你需要查看它们。
最简单(尽管不是最有效)的方法是简单地循环查找最大的元素并再次循环以确保它大于元素的一半。
如果已排序:
(假设按升序排序,按降序排列相似)
你可以看看最后一个元素和中间元素,如果它们相等(意味着至少有一半的元素是相同的,没有元素更大),没有这样的元素,如果没有,最后一个元素元素就是这样一个元素。
可以在O(1)
。