【问题标题】:Java: finding index of maximum from slice of an arrayJava:从数组的切片中查找最大值的索引
【发布时间】:2011-09-30 02:33:40
【问题描述】:

我有一个大数组。我有一些 Java 代码用于识别该大数组的子集/切片的起点和终点的索引。我需要从数组的选定子部分检索的唯一信息项是局部最大值和最小值的索引和值。在指定范围内找到最大值和最小值的最快(且内存占用最少)的方法是什么?

这是我需要的代码的开始:

// Step One: declare new array and populate it
pts = new double[5000];
for (int i = 0; i < 5000; i++){ pts[i] = (value assigned by extraneous process);}
// Step Two: slice out section between indices 3600 and 3750
    // what code do I write here?
// Step Three: find max value in the sliced section and return its index
    // what code to I write here?

【问题讨论】:

  • 所有局部最大值和局部最小值,或任何局部最大值/最小值?
  • 整个切片只有一个最大值和一个最小值
  • 找到最小值/最大值后,如果您要一次又一次地搜索同一区域,您可能希望存储它们...
  • 感谢大家提供意见。我现在将其标记为已回答。

标签: java arrays max slice min


【解决方案1】:

只需遍历所需范围并记录最大和最小可见值:

double max = Double.NEGATIVE_INFINITY;
double min = Double.POSITIVE_INFINITY;
int minIndex = -1;
int maxIndex = -1;
for(int k = 3600; k < 3750; k++){
    if(max < pts[k]){
        max = pts[k];
        maxIndex = k;
    }else if(min > pts[k]){
        min = pts[k];
        minIndex = k;
    }
}

【讨论】:

    【解决方案2】:

    如果不需要为切片创建数组的副本,您基本上可以一口气完成第 2 步和第 3 步:

    double max = pts[3600]; //the value of the first element in the slice
    int maxIndex = 3600; //keep track of the index as you go. Assume at first
                         //that it is the first index of the slice
    for(int i=3601; i<=3750; i++){
      if(pts[i] > max){  //you have encountered a larger element. Update the maxes
        max = pts[i];
        maxIndex = i;
      }
    }
    System.out.println("The max is " + max + " and occurred at index " + maxIndex);
    

    (抱歉有任何语法错误,我一直在搞乱Scala,语法有点不同)

    【讨论】:

    • 你是如何定义最大值的?您在第一行将其声明为包含 3600 个元素的数组,然后在第 4 行和第 5 行将其用作单个值。
    • 不,在第一行中,我声明了最大值,并将其设置为 pts 数组的索引 3600 处的值。我也可以将其设置为 Double.MIN_VALUE,它可能不会对整个代码产生任何影响。
    • @Dylan: Double.MIN_VALUE 不是 double 可以表示的 最低 值,而是最小(如最接近零)值,如果您想要最低值,即负无穷大:Double.NEGATIVE_INFINITY(许多程序员都被这个小而危险的错误绊倒了)
    • @Mark:感谢您的提示。我想我太习惯使用 Integer 版本了
    【解决方案3】:

    有一个循环遍历选定的小节一次。

    在循环中,调整四个变量maxValuemaxIndexminValueminIndex 的值,找到新的最大值或最小值。

    循环之后,你会得到最大值和最小值以及它们的位置。

    不需要额外的内存,线性性能(只需遍历数组的选定部分)。

    【讨论】:

      【解决方案4】:

      如果您要经常这样做,您可以通过跟踪不同尺度的最大值/最小值来提高性能。

      例如,如果您为每 20 行保留一个列表,并且要检查 55 - 184 的范围,则只需检查 5 个值 (55-59),然后检查 60-179 中的 6 个值,然后从 180 到 184 的 4 个值,所以这是 15 次检查而不是 130 次,速度提高了 20 倍。

      当然,您需要在数组更改时将存储桶标记为已更改并定期更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 2021-06-20
        • 1970-01-01
        相关资源
        最近更新 更多