我的应用程序将对密集矩阵执行大量矩阵运算(例如,加法/乘法)。我想缓存唯一结果以避免重复计算。
密集矩阵:
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) 将“哈希表”作为结构中的“字段”保留有意义吗?这样,我已经有了左操作数,我只需要在乘法表中搜索右操作数。或者,是不是应该有一个独立的表,左右操作数都是key?
(c) 我应该为加法/乘法等创建单独的表,还是应该有一个包含操作数和运算符的表?
(d) 跟踪所有创建的对象以便适当释放这些对象的最佳方法是什么?
(e) 哪个公开可用的库(在 c 中)适合实现这样的东西?
我正在寻求有关 (a) 解决问题的替代方法,以及 (b) 此类替代方法的优点/缺点的意见/建议。
最后,我发现这个论坛非常有帮助,并想表达我的感激之情。++谢谢。
最佳答案
你必须非常小心哈希。如果您有冲突(不同原始值的相同哈希值),您可能会得到错误的结果。 你确定计算矩阵的散列比执行实际操作更有效吗(这显然取决于这些操作的数量/复杂性)
第二个问题 - 您还没有说明您的缓存逐出策略。你打算只添加到哈希表而不删除吗?根据不同矩阵的数量,您可能会耗尽内存...
关于c - 跟踪结果是否已经使用哈希表计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1285945/