我正在尝试实现this article中提出的动态编程来解决最短哈密顿路径问题。此解决方案要求将值存储在名为DP的大小为n
x 2^n
的二维数组中,其中n
是图的节点数。
我的图表有超过100个节点,但它非常稀疏,所以矩阵DP的大多数元素都是+无穷大。因此,我可以使用稀疏矩阵库存储它(并将零元素视为+无穷大)。例如,使用Eigen:
Eigen::SparseMatrix<double> M(n, 1 << n);
M.reserve(5e8); // reserve 4GB of RAM since I'm not able to estimate the number of non-zeros
但是,此矩阵的最大索引为2^n - 1
(在C ++代码2^n
中为1 << n
),远远大于索引允许的范围(如果{{1} }} 例如)。对于非常大的n = 100
,操作1 << n
也不再有效(我尝试了n
并且在n = 114时获得了262144。
所以,虽然我的矩阵的非无限元素的数量可以适合内存,但我不知道如何处理索引。
如果有人能帮我解决这个问题,我会非常感激。非常感谢你!