2011-07-07 101 views
2

的切片的最大索引找到我有一个大的阵列。我有一些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? 
+0

所有本地最大值和本地最小值,或*任何*本地最大值/最小值? –

+0

只是一个最大值和整个切片的最小值 – CodeMed

+0

一旦找到最小/最大值,如果您要一次又一次搜索同一个区域,您可能希望存储它们... – karnok

回答

4

只是遍历所需的范围和记录最大值和最小值看到值:

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; 
    } 
} 
3

如果没有必要创建数组的副本为您切片,你基本上可以做到步骤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乱搞和语法是有点不同)

+0

你怎么定义max?你在第一行将它声明为一个包含3600个元素的数组,但在第4行和第5行中将它用作单个值。 – CodeMed

+0

不,在第一行中,我声明了max,并将其设置为索引处的值该阵列的3600。我也可以将它设置为Double.MIN_VALUE,它可能不会对整个代码产生任何影响。 – Dylan

+1

@Dylan:Double.MIN_VALUE不是double可以表示的*最低*值,而是最小(如最接近零)值,如果您想要*最低*值,那就是负无穷大:Double。 NEGATIVE_INFINITY'(很多程序员被这个小而有害的错误绊倒了) –

1

有一个循环,在越过选定的第CE。

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

循环后,您将拥有最大值和最小值以及它们的位置。

没有额外存储器所需的,线性的性能(仅有一个传过来的阵列的所选择的部分)。

1

如果你打算这样做了很多,你可以通过在不同的保持最大值/最小值的轨道提高性能秤。例如,如果您每20行保留一个列表,并且您想检查范围55 - 184,则只需要检查5个值(55-59),然后从60-179中选择6个值,然后4个值从180 - 184,所以这15个检查,而不是130,20倍的速度增加。

当然,当数组发生变化并定期更新它们时,您需要将您的存储桶标记为已更改。