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