【问题标题】:Using a hashmap instead of a table for memoization使用 hashmap 而不是 table 进行记忆
【发布时间】:2018-01-05 21:24:05
【问题描述】:
在一些动态编程问题中,我注意到我的缓存表非常稀疏。换句话说,如果我将一个表定义为DP[i][j], i<=10^6, j<=10^2,则只使用了该表的一小部分,其余部分为-1。
所以我的问题是,通常的做法是使用 hashmap 来存储 (i, j) 对及其 DP 值并在平均 O(1) 时间内访问它们,而不是将它们存储在稀疏表中以节省内存?
【问题讨论】:
标签:
recursion
dynamic-programming
backtracking
【解决方案1】:
首先,是的,您可以使用 hashmap 代替数组来解决动态编程问题。但是使用哈希图有一些限制和好处。
当您为这种特殊情况(动态编程)使用哈希图时,它会降低内存复杂性,但同时会增加代码的常数因子。这意味着如果您可以在数组的帮助下执行 10^{8} 次操作/秒,那么在使用 hashmap 时您将能够执行大约 10^{7} 次操作/秒,因为它的常数因子尽管具有相同的复杂性算法。
因此,如果可以声明这么多大小的数组,请使用数组,否则使用哈希图。
【解决方案2】:
是的,使用 hashmap 绝对是一种常见的做法。特别是在稀疏的情况下。
甚至有可能超越这一点...对于更大的问题,近似动态规划借鉴了函数逼近等工具。