私のアプリケーションは、密行列に対して多数の行列演算 (加算/乗算など) を実行します。計算の重複を避けるために、一意の結果をキャッシュしたいと考えています。
密行列:
typdef struct denseMatrix{
int m;
int n;
double **d; // actual matrix
multiplyTable **entry; // key & result
} dns;
テーブル エントリ:
typedef struct multiplyTable{
dns *rightOperand; // key
dns *result; // value
} multiplyTable; // or something like that
dns *A, *B, *C, *D...; // allocated internally
C = mult(A,B); //may be called many many times.
この場合、mult はエントリ (オペランド、結果) のペアをテーブルに追加します。
add(A->entry, B, C); //B is the right operand and C is the result
後で D = mult(A, B) が再度呼び出される場合、search(A->entry,B) は C を取得します。一方、特定のオペランドがリストにない場合は、次のように追加されます。結果行列へのポインタ。
私はこれまでにこのようなことをしたことがなく、これが問題にアプローチする方法であるかどうかさえわかりません. 私の限られた理解では、ハッシュテーブルを使用してこのようなものを実装できます。
私が持っている実際的な質問には次のようなものがあります: (a) ハッシュテーブルはそもそも問題に対する適切な解決策ですか? ポインターアドレスをキーと値として許可しますか??
(b) 「ハッシュテーブル」を構造体の「フィールド」として保持することは理にかなっていますか? そうすれば、すでに左側のオペランドがあり、乗算テーブルで右側のオペランドを検索するだけで済みます。それとも、左オペランドと右オペランドの両方をキーとして持つ独立したテーブルが必要ですか?
(c) 足し算や掛け算などのために別のテーブルを作成しますか?それとも、オペランドと演算子を含む単一のテーブルを作成する必要がありますか?
(d) 作成されたすべてのオブジェクトを追跡して適切に解放できるようにする最善の方法は何ですか??
(e)このようなものを実装するのに適した公開ライブラリ(c)はどれですか?
私は、(a) 問題にアプローチできる別の方法、および (b) そのような別の方法の長所/短所に関する意見/提案を求めています。
最後に、このフォーラムは非常に役に立ちました。感謝の意を表したいと思います。++ありがとうございます。