2011-11-15 10 views
1

タイトルが適切かどうかわかりませんが、これは設計上の質問です。 計算量の多いメソッドを持つJavaクラスを設計していますが、メソッドが呼び出されるたびにこの計算を避けるためのきれいな方法があると思います。私は、呼び出しコードがこれを処理できることを知っていますが、それは常に呼び出しコードの責任であるべきですか?クラスメソッドが呼び出されるたびに計算を避ける

具体的には - 大きさを計算する方法で千次元ベクトルのクラスを作成しました。このメソッドが呼び出されるたびに、すべての次元の大きさが計算されます。

+1

キャッシュの後ろの計算を隠し、ベクトルが更新された場合にのみ再計算しますか? – mcfinnigan

答えて

3

あなたが探している概念は、あなたのベクトルかに変更があるかどうかを示すためにMemoization

0

クラスの内部構造をキャッシュするだけです。メソッドが呼び出されると、以前に計算された結果がキャッシュにあるかどうかが調べられ、それが返されます。それ以外の場合は、計算を実行して結果をキャッシュに格納します。しかし、メモリには注意してください。

0

USEフラグと呼ばれています。変更がある場合、メソッドは完全な計算を行うか、または変更のみに計算を適用する必要がありますが、クラスの残りの実装をすべて使用して、フラグが正しく設定されるようにする必要があります。値が変更されます。

2番目の方法はキャッシュを使用することです。これは、以前に計算された結果を格納し、計算を行う前にルックアップすることによって行われます。しかし、このメソッドは、オブジェクトのキー値にさまざまなバリエーションがなければ、多くのメモリを使用することになります。特に、キーの値がdouble型の場合、キーの値が正確に等しくない場合、キーの値が決して見つからない可能性があります。

0

"1000次元ベクトル"がc'torで渡された場合、c'torの大きさを計算して、いくつかのプライベートメンバー変数に格納することができます。世話をするために

いくつかあります:

  • その後、あなたはそれらの方法で大きさを更新する必要がベクトルのベクトルや内容を追加/削除するためのメソッドがある場合。
  • クラスがスレッドセーフであると想定されている場合は、適切な書き込み関数がアトミックであることを確認してください。
0

どのくらいの頻度で変更されますか?これは不変ですか?どのようにベクトルのためのインターフェイスのあなたは制御しますか?具体的には、1000次元空間における回転やその他のマグニチュード保存の変換を識別する方法はありますか?大きさの状態を保存し、値が変更されたときにフラグを立て、必要なときにのみ再計算することができます。変換に素敵な内部構造がある場合は、その知識に基づいて計算をスキップすることができます。

関連する問題