在java中最有效地计算数组的最大/最小值 我考虑两种方法来计算数组的最大/最小值。

在java中最有效地计算数组的最大/最小值 我考虑两种方法来计算数组的最大/最小值。,java,arrays,sorting,max,minimum,Java,Arrays,Sorting,Max,Minimum,第一: public class Extrema { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub double[] arr = new double[] { -0.11112, -0.07654, -0.03902, 0.0, 0.03902, 0.07654, 0.11112, 0.14142, 0.

第一:

public class Extrema {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    double[] arr = new double[] { -0.11112, -0.07654, -0.03902, 0.0,
            0.03902, 0.07654, 0.11112, 0.14142, 0.1663, 0.18478, 0.19616 };
    double max = Double.NEGATIVE_INFINITY;
    // Find out maximum value
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
}

}
公共类极值{
/**
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
double[]arr=新的double[]{0.11112,-0.07654,-0.03902,0.0,
0.03902, 0.07654, 0.11112, 0.14142, 0.1663, 0.18478, 0.19616 };
双最大值=双负无穷大;
//找出最大值
对于(int i=0;i最大值){
max=arr[i];
}
}
}
}
第二种方法是对数组进行预排序,然后将arr[0]作为最小值,将te数组的最后一个条目作为最大值

据我所知,最快的排序算法是0(n logn)。 第一次进近的循环时间为0(n)。但是使用n个比较,最坏的情况是n个写入操作。 由于java中的时间测量并不可靠,因此有必要将此问题正式化。。。
我更喜欢第一种方法。。我说得对吗?特别是如果我需要两个极值,因此需要第一种方法具有计算复杂性
O(n)
,第二种方法具有
O(n*log(n))
,正如你所说。但是请记住,这种联想复杂性忽略了常数因子,因此很容易出现线性算法实际上比
n*log(n)
算法慢的情况。然而,在您的特殊情况下,您不能比简单的迭代更好,这实际上是最好的解决方案

然而,有趣的是,有一种基于qsort分区的线性算法来查找序列中的第k个元素。该算法内置于C++的stl中。如果有兴趣,你可以看看


如果数组从未更改,并且您有许多查询,那么第一种方法至少可以和第二种方法一样快—只需缓存在第一次查询中找到的值。

首先,如果输入足够大,时间测量就足够可行

其次,在示例代码中,比较和写操作都不重要。大部分时间将用于访问内存中的大型阵列(整个问题仅与大型阵列相关,其中包含数百万个元素)并将其移动到CPU缓存

第三,如果您想要两个极值,最好在只遍历数组一次时获取它们。这相当于2*n比较(与n^2无关),并且仍然在很大程度上受访问内存中数组数据的支配

如果多次需要同一数组的max/min,只需存储它,而不是每次都计算它。除非您需要在另一个位置对数组进行排序(或者您可以对其进行一次预排序,然后恢复程序的每次运行),否则排序没有任何意义来获得最小/最大值。

只是一个想法

无论您选择什么搜索算法,都可以利用多线程。例如,假设array size=10,您可以生成两个线程1。线程1将在数组的前半部分2执行搜索。线程2将在数组3的后半部分执行搜索。然后最后比较这两个线程的结果以确定结果


如果你选择考虑多线程来加快搜索速度,你必须考虑诸如线程的最佳数量之类的耦合因素(因为线程的高数量会导致大部分时间花费在上下文切换中),堆栈可用性等。

预排序数组的问题是,在插入新元素后,您必须再次对其进行排序,新元素充其量也将是一个O(N)操作。数组在构建后将永远不会被触及。。这就是“相同数组”预排序的含义,它意味着得到最小/最大值是O(1),当然这比O(N)好,但您仍然需要为排序付费。我不知道你在问什么。对不起,也许我在想问题时犯了一些错误。。从同一个类多次调用一个方法是完全没有意义的。。那么这个问题就可以归结为一般更好的问题。。预排序与否。。如果要同时计算最大值和最小值,整个数组上的循环是否仍优于排序?如果不能在同一个循环中同时计算这两个参数..如果数组不打算更改,为什么还要进行预排序。。您可以计算一次最小/最大值,并在每次+1时继续返回该值,以了解有关缓存位置的注意事项。对数组进行排序将导致缓存线被多次加载。而简单的迭代意味着每行只加载一次。那么对于非常大的数组,未排序数组上的循环显然要好得多。非常感谢。