2012-03-02 22 views
1

配列の配列を持っています。 float[][] Test例えばJava:条件を満たす配列のサブセットを取得

{ {433801.000f,335601.000f,5}, 
    {433821.000f,335631.000f,5}, 
    {433811.000f,335671.000f,5} }; 

どのように値が基準を満たしてこの配列(または配列の配列)のサブセットを、得ることができます。 Test[i][0] > 40000Test[i][1] + Test[i][2] < 350000

私は明らかに、リストを反復処理することができる。例えば

。しかし、アレイの大きさが非常に大きい場合、これは非常に遅くなります。

どうすればベクター化された方法でこれを行うでしょうか。

また、制限がある場合は、JavaMEを使用してください。しかし、JavaSEソリューションは偉大な​​洞察でもあり、うまくいけばJavaMEで働くでしょう。

+1

JavaSEやJavaMEのように、ベクトル化された計算を明示的に行うことはできません。 JVM *はいくつかの計算をベクトル化するかもしれませんが、おそらく非常に単純でなければならず、あなたの配列はこれを可能にするレイアウトを持っていないと思います。 – andrewmu

+0

回答を歓迎します。私はビットを再構築します;) – Doomsknight

答えて

5

データに関する詳細情報を保存しない限り、反復処理を行わずに行う方法はありません。

私は完全なデータを格納することに加えて、すべての新しいレコードのために、あなたはあなたの状態でそれをテストし、それが本当ならば、別の配列内のアイテムの参照を保存する(だけでなく、Vectorがない限り、これらの両方のために優れていることを示唆していますストレージは、実際にはタイトです)。

次に、条件に一致するすべての項目が必要な場合は、2番目の「配列」内のすべての参照を検索します。これはおおまかにいくつかのデータベースクエリが最適化される方法です。ルックアップコストは、挿入コストとストレージコストの増加を犠牲にして減少します。

+1

JavaMEには 'ArrayList'はありません。 –

+0

申し訳ありませんが、私はJavaMEをやってからしばらくしていました - 私は 'Vector'(そのことを示すために編集)を意味しました。ありがとう。 – andrewmu

2

私はアレイ全体を反復処理し、それらの条件をテストすることは他の方法と同じくらい速いと思います。利点は実装が非常に簡単だということです。その配列がどれだけ大きいと思いますか?最悪の場合、数千の行しかない場合、あなたは大丈夫です:)。

+0

ベクトル化された方法はありませんか?これにより速度が大幅に向上します。はい、数千の記録があります。しかし、このコードは多く実行されます。おそらく数秒ごと。 – Doomsknight

+0

"ベクトル化されたメソッド"とは何ですか?配列のどの要素が特定の要件を満たしているかを知りたい場合は、上記の@andrewmuで説明したようなインデックス方法を使用しない限り、配列の各要素を調べる必要があります。 – Bombe

+0

http://stackoverflow.com/tags/vectorization/info "ベクトル化とは、関数が一列に配列全体を処理するプログラミングパラダイムを指します。これは、関数呼び出し、メモリアクセス、並列化、およびコード表現の面で利点をもたらします。ベクタライズ時に最高のパフォーマンスを発揮するように最適化されたMATLABなどの言語 – Doomsknight

1

リニアスキャンを回避する唯一の方法は、ソートされた方法でデータを保存することです。木構造のようなものを使うことは、おそらく早見のための方法です。これは、配列の配列にデータを格納しないことを意味します。これは、メモリ要件に違反する可能性がありますが、これはトレードオフです。

関連する問題