Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 高效查找阵列中的最大元素_Java_Comparison - Fatal编程技术网

Java 高效查找阵列中的最大元素

Java 高效查找阵列中的最大元素,java,comparison,Java,Comparison,我有一个程序,可以找到数组中最大的两个元素。我必须查看数组元素之间的比较次数来确定效率(不是big-O)。我已经确定最坏的情况是2n-3比较(假设前两个元素最大),这里是函数 Integer[] A = {11,22,8,7,5,6,7,8,1,9}; int largest = 0; int secondLargest = 0; int count = 1; if (A[0] < A[1]){ largest = A[1];

我有一个程序,可以找到数组中最大的两个元素。我必须查看数组元素之间的比较次数来确定效率(不是big-O)。我已经确定最坏的情况是2n-3比较(假设前两个元素最大),这里是函数

Integer[] A = {11,22,8,7,5,6,7,8,1,9};
    int largest = 0;
    int secondLargest = 0;
    int count = 1;
    if (A[0] < A[1]){
        largest = A[1];
        secondLargest = A[0];
    } else {
        largest = A[0];
        secondLargest = A[1];
    }
    for (int i = 2; i < A.length; i++){
        count++;
        if (A[i] > largest) {

            secondLargest = largest;
            largest = A[i];
        } else {
            count++;
            if (A[i] > secondLargest) { 
                secondLargest = A[i];
            }
        }
    }
System.out.println("Largest:" + largest + " Second:" + secondLargest + " count:" + count);
Integer[]A={11,22,8,7,5,6,7,8,1,9};
int最大=0;
int=0;
整数计数=1;
if(A[0]最大值){
第二大=最大;
最大值=A[i];
}否则{
计数++;
如果(A[i]>第二大){
第二大=A[i];
}
}
}
System.out.println(“最大值:“+最大值+”第二个:“+第二个最大值+”计数:“+计数”);
我使用count来确定比较的数量。 有没有办法减少此函数中最坏情况比较的次数?我不知道如何使这个函数更好。

2n-3
(通过
1+2(n-2)
)因为最坏的情况差不多是你能得到的最好结果:你必须查看所有
n
值,并且对于每一个值,你必须检查最坏情况下的
2
最大值

如果您交换支票,您可以获得一些效率:

if ( A[i] > secondLargest )
{
   if ( A[i] > largest )
     secondLargest = largest,
     largest = A[i];
   else
     secondLargest = A[i];
}
因为如果一个值不高于第二个最大值,它就不会大于最大值。在最佳情况下(降序排序列表),这会将效率提高到
n-3
,而您的算法在这里也有
2n-3


但是,最坏的情况(升序排序列表)仍然是一样的。

无论您选择什么算法,您都能够找到每个元素必须与最大和第二大元素进行比较的情况

然而,在更常见的随机分布情况下,您可以通过首先比较第二大值来避免大量比较。大多数元素将小于第二大值,并将避免第二次比较

if (value > secondLargest) {
    secondLargest = value;
    if (secondLargest > largest) {
        int temp = largest;
        largest = secondLargest;
        secondLargest = temp;
    }
}
或更好(海事组织):


请注意,对于小数组
数组。sort
只需进行简单的比较和交换。

只需对数组进行预排序,从技术上讲,您将知道它在恒定时间内的最大元素数!对于最坏情况下的操作数,您的算法似乎是最优的。顺便说一下,在数组中查找最小(或最大)n个元素的算法称为算法。
int[] largest = new int[2];
for (int value: A) {
    if (value > largest[1]) {
        largest[1] = value;
        Arrays.sort(largest); 
    }
}