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?
4

4 に答える 4

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;
    }
}
于 2011-07-07T02:03:11.247 に答える
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 をいじっていて、文法が少し異なります)

于 2011-07-07T02:02:21.777 に答える
1

これを何度も行う場合は、さまざまなスケールで最大値/最小値を追跡することでパフォーマンスを向上させることができます。

たとえば、20 行ごとにリストを保持していて、55 ~ 184 の範囲をチェックする場合、5 つの値 (55 ~ 59)、次に 60 ~ 179 の 6 つの値、次に 4 つの値をチェックするだけで済みます。 180 - 184、つまり 130 ではなく 15 のチェックであり、20 倍の速度増加です。

もちろん、配列が変更されたときにバケットを変更済みとしてマークし、定期的に更新する必要があります。

于 2011-07-07T02:44:59.020 に答える
1

選択したサブセクションを 1 回通過するループを作成します。

ループ内で、新しい最大値または最小値が見つかったら、4 つの変数maxValuemaxIndex、の値を調整します。minValueminIndex

ループの後、最大値と最小値、およびそれらの位置が表示されます。

余分なメモリは必要なく、線形のパフォーマンス (配列の選択された部分を 1 回通過するだけ) です。

于 2011-07-07T02:02:48.227 に答える