要找到数组中的三个最大元素(长度为100),for循环和if语句的组合是最有效的方法,还是有更有效的方法?
答案 0 :(得分:7)
我的问题不是很清楚。
最有效的方法是保持大小为3
的最大堆,并将数组元素逐个插入最大堆。
最后,最大堆中的3
元素是原始数组中最大的3
元素。
通常,通过维护大小为M
的最大堆,可以最好地解决在大小为N
的数组中查找max M
元素的问题。
答案 1 :(得分:4)
对于长度为100的数组和最多3个项目,您甚至可以先对数组进行排序,然后选择前三个元素 - 性能差异可以忽略不计。
对于更大尺寸的数组,如果将3个元素与当前元素进行比较,则for循环听起来不错。
如果你必须找到M大小数组的前N个元素,那么我认为排序效率最高。
答案 2 :(得分:4)
我认为你可以通过阵列中的单个循环来完成它,我认为你不能更快地完成它。类似的东西:
int max1 = Integer.MIN_VALUE;
int max2 = Integer.MIN_VALUE;
int max3 = Integer.MIN_VALUE; //assuming integer elements in the array
for (int i = 0; i < theArray.length; i++)
{
if (theArray[i] > max1)
{
max3 = max2; max2 = max1; max1 = theArray[i];
}
else if (theArray[i] > max2)
{
max3 = max2; max2 = theArray[i];
}
else if (theArray[i] > max3)
{
max3 = theArray[i];
}
}
如果你想要数组中的前N个元素,你可能只想对它进行排序。
答案 3 :(得分:2)
由于这是java,你总是可以使用一个SortedSet(例如TreeSet),它以最小的代价(log(n))插入元素时执行排序,当你完成插入时,你可以使用descendingIterator()来检索三个最大的元素。
答案 4 :(得分:1)
建立Riley逻辑,跳过考虑前3位的重复元素,我建议纠正这个问题:
int max1 = Integer.MIN_VALUE;
int max2 = Integer.MIN_VALUE;
int max3 = Integer.MIN_VALUE; // assuming integer elements in the array
for (int i = 0; i < theArray.length; i++) {
if (theArray[i] > max1) {
max3 = max2;
max2 = max1;
max1 = theArray[i];
} else if (theArray[i] > max2) {
if (max1 == theArray[i]) {
// Neglect as already present in max1
} else {
max3 = max2;
max2 = theArray[i];
}
} else if (theArray[i] > max3) {
if (max1 == theArray[i] || max2 == theArray[i]) {
// Neglect as already present in max1 OR max2
} else {
max3 = theArray[i];
}
}
}
答案 5 :(得分:0)
假设数组没有排序,你必须使用for循环(或类似的东西)遍历每个元素。
确实没有更有效的方法可以迭代每个元素。
答案 6 :(得分:0)
你应该只需要遍历列表一次,但是,你必须遍历它。(假设它没有排序)。
答案 7 :(得分:0)
最好和最有效的方式(在我看来)将首先对数组进行排序(最好是Merge Sort
),然后获得前3个值。
答案 8 :(得分:0)
有些人发帖说要排序是最好的方法然后抢到前3名。但是如果有一个O(log N)插入到排序的集合中,你将需要做N次或者做一次O(NlogN)排序(顺便说一句是N ^ 2最坏的情况)你最终得到NlogN效率,而不是像上面发布的Riley那样用max1 / max2 / max3迭代数组的简单O(N) 。排序或插入已排序的集合是最简单但不是最有效的。
答案 9 :(得分:0)
_start':(.text+0x18): undefined reference to