c - 跟踪结果是否已经使用哈希表计算

标签 c caching hashtable lookup

我的应用程序将对密集矩阵执行大量矩阵运算(例如,加法/乘法)。我想缓存唯一结果以避免重复计算。

密集矩阵:

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/

相关文章:

将 GCC 的 __builtin_ia32_pshufd 和 __v4si 模式转换为可移植内在模式?

java - 在不使用太多内存的情况下加快搜索缓存

caching - 256 KB 的缓存大小真的是 256 KiB?

java - 图像被缓存并耗尽了我的堆空间

c++ - HashTable... 错误:静态断言失败:std::hash 不专门用于此类型

java - 整数区间内的哈希表键

c - 需要在 shell 脚本中获取 C 程序名称

c - 为什么 getchar() 需要不终止我的无限循环?

c - 如何在C中查找、计数并显示卡片对,其中2或3张卡片为一对,4张卡片为两对?

java - 我如何评估哈希表的实现? (引用HashMap)