如何优化我当前的getMax方法来检索数组中的最大数字?

时间:2010-09-10 01:44:24

标签: java algorithm optimization search

在应用“最佳做法”时,优化此代码以使其更有效的最佳方法是什么?这只是一个简单的学校项目而且有效,我已经测试过了。但我觉得有一种更好,更有效的方法来编写这种方法。你觉得怎么样?

  1. 我有一个数组 预先填充了一堆 数字。 getMax()方法 检索中的最大数字 阵列。但是如果数组是空的呢 返回-1
  2. nElems只是一个变量,用于跟踪数组中存在多少元素。

  3. array是在类的开头声明的私有数组。

    public int getMax() {
    int k = 0;
    int max = array[0];
    
    for(int j=0; j<nElems; j++) {
        if(max < array[j])
            max = array[j];
    }
    
    if(k == nElems)
        return -1;
    else return max;
    } // end of method
    
  4. 哦,我该如何命名我的k变量以使其更具可读性?其目的是为0,因此可以根据数组中元素的数量来检查,以返回-1或最大数字;

    假设所有数组值均为正值。

5 个答案:

答案 0 :(得分:4)

您不需要使用nElems跟踪数组中的元素数量,除非您的意思是您有一个部分填充的数组,而nElems是其中实际的插槽数有价值。更有可能的是,您应该使用array.length来检查数组的长度。

您不需要变量k为“0”。文字0是0的精确表示。因此,如果要在数组为空时返回-1,则可以使用

启动方法
if (array.length == 0)
  return -1;

也就是说,为空数组返回-1有点奇怪,因为-1应该是该方法的有效结果。

答案 1 :(得分:3)

  

它的目的是为0,所以它可能是   检查元素的数量   在数组中返回-1或   最高的数字;

零不需要名称 - 如果您的意思是0,请使用文字0

你的循环很好。您可以尝试优化它,但它们不一定有用。几乎总是你可以将这种本地化的“锁孔”优化留给JIT。如果你只是想尝试一些东西作为学习练习,那么你可以尝试如下:

  • 而不是两次使用数组,将变量设置为数组值,然后使用两次。
  • unroll the loop不同金额。如果numElem不是您展开次数的倍数,请注意不要错误地访问错误的索引。
  • 通过数组而不是转发
  • 向后工作 如果您遇到Integer.MAX_VALUE的值,
  • 立即返回。你不会找到更大的东西。很难定义它的性能效果,因为它会加速MAX_VALUE不接近结束的大型阵列,但最有可能减慢其他所有的速度。不过,看看它有多大差异可能会很有趣。
  • 你能想到的任何其他事情。

我并不是说这些都会产生影响,无论是更快还是更慢,但他们都可以。所以运行它们并计算每个进度的速度。你最有可能学到的是,与将其留给JIT相比,这些东西不值得你花时间。但你永远不知道; - )

可以清理周围的代码,使其更易于理解,而不是让它更快。例如:

public int getMax() {
    int max = -1;
    if (nElems > 0) {
        max = array[0];
        for(int j=1; j<nElems; j++) {
            if(max < array[j])
                max = array[j];
        }
    }
    return max;
}

这也会删除代码中的错误,如果数组大小为0,那么您可以访问第二行中的超出范围。 ColinD这样做的方式同样好,我为了变化而展示了不同的东西。

这是较短的代码,假设所有值都是非负的:

public int getMax() {
    int max = -1;
    for(int j=0; j<nElems; j++) {
        if(max < array[j])
            max = array[j];
    }
    return max;
}

答案 2 :(得分:1)

我找到的最基本的原语如int .. 使用Integer而不是int。

Integer[] arr = { 6, 7, 10, 15, 2, 4, 8 };
Integer max = Collections.max( Arrays.asList(arr) );

并完成..: - )

答案 3 :(得分:0)

理论上,在多处理器(k处理器)系统上,您可以通过将列表划分为k个子列表来加快速度。产生一个进程以找到每个子列表的最大值,然后找到最大值的最大值。

如果

,您可能会或可能不会加速
  1. 你有一个多处理器系统;和
  2. 名单很大。

答案 4 :(得分:-1)

看看http://www.sorting-algorithms.com/它有一些排序算法,解释和动画,可以让你很好地了解排序过程中发生了什么。希望它有所帮助。