数组中的三个最大值

时间:2010-10-07 15:54:05

标签: java arrays

要找到数组中的三个最大元素(长度为100),for循环和if语句的组合是最有效的方法,还是有更有效的方法?

10 个答案:

答案 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