2011-07-07 20 views
2

私は大きな配列を持っています。私はその大きな配列のサブセット/スライスの開始点と終了点のインデックスを識別するためのJavaコードをいくつか持っています。配列の選択されたサブセクションから取得する必要がある唯一の情報項目は、ローカル最大値と最小値のインデックスと値です。指定された範囲内で最大値と最小値を見つけることができる最も速い(そして最もメモリを消費しない)方法は何ですか?ここで Java:配列のスライスから最大のインデックスを見つける

は、私は、コードの面で必要なものの始まりです:

それはあなたのスライスの配列のコピーを作成する必要はありません場合は、基本的に1のステップ2と3が落ち行うことができます
// 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

スライス全体の最大値と最小値の1つだけ – 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

急襲:

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); 

(構文エラーのため申し訳ありませんが、私はスカラ座をいじりてきたと文法が少し違う)

+0

どのようにmaxを定義していますか?最初の行に3600要素の配列として宣言しますが、4行目と5行目では1つの値として使用します。 – CodeMed

+0

いいえ、最初の行ではmaxを宣言してindexの値に設定しますpts配列の3600。私はDouble.MIN_VALUEに設定することもでき、おそらく全体的なコードには何の影響も与えませんでした。 – Dylan

+1

@Dylan:Double.MIN_VALUEはdoubleが表すことができる*最低の値ではなく、*最も低い*値を求める場合は最小の(ゼロに最も近い)値で、負の無限大です: 'Double。 NEGATIVE_INFINITY'(多くのプログラマがこの小さな、しかし危険なエラーによってトリップしました) –

1

が上の選択のサブセクションの上に行くのループを持っていますce。ループでは

、新しい最大値または最小値を見つけるように、4つの変数maxValuemaxIndexminValueminIndexの値を調整します。

ループの後に、最大値と最小値、およびそれらの位置があります。

メモリの追加が不要で、線形のパフォーマンス(アレイの選択された部分を1回だけ通過)。

1

あなたはこれをたくさんやろうとしている場合は、別の時に最大値/最小値を追跡することで、パフォーマンスを向上させることができスケール。

たとえば、20行ごとにリストを保持し、55〜184の範囲をチェックする場合は、5つの値(55〜59)、60〜 180から184までの4つの値があります。つまり、130ではなく、15回のチェックで、20倍のスピードアップとなります。

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

関連する問題