如何在动态编程中选择缓存的初始值?

时间:2019-06-22 01:02:08

标签: c++ dynamic-programming

每当我使用动态编程用解决方案编写代码时,我的代码就会看起来像这样:

table[1000][1000]  //the cache to store initialized with a certain_value
function(parameters i,j){
    if(base_condition){
        return base_value
    }
    if(table[i][j] != certain_value){
        return table[i][j];
    }
    answer = some operation using function();
    table[i][j] = answer;
    return answer;
}

通常,我将此certain_value选择为-1。但是现在我正在编写一个代码,该函数可以返回所有实数。因此,我该如何选择该值,或者应该更改方法。

3 个答案:

答案 0 :(得分:2)

您可以使用bool元素的并行数据结构来表示已缓存了哪些元素。

或者,您可以使用std::optional作为元素类型,并让空值表示一个非缓存的值。

答案 1 :(得分:1)

您可以有一个布尔数组。如果您曾经为(i,j)计算过,则对该布尔值[i] [j]保持为真。因此,当您测试此状态是否已预缓存时,只需使用boolean [i] [j]是否为true进行测试。如果为true,则从表数组返回存储的值。

boolean visited[1000][1000]={false}
table[1000][1000]  //the cache to store intialized with a certain_value
function(parameters i,j){
    if(base_condition){
        return base_value
    }
    if(visited[i][j] == true{
        return table[i][j];
    }
    answer = some operation using function();
    table[i][j] = answer;
    visited[i][j]=true;
    return answer;
}

答案 2 :(得分:1)

您还可以采用其他方法。如果您想坚持使用惯用的方法,那么这个问题与动态编程无关,而与sentinel values有关。如果所有实数都可能,您可以将哪个值用作标记​​?

我注意到的一个细节是所有 real 数字都是可能的。既好又坏。不好是因为一台计算机不能代表每个实数,但是大概已经考虑了这一点。很好,因为大多数用于表示实数的方法都包含一些不是实数的值。最明显不是实数的floatdouble值是NaNs(不是数字)。另一个选项是infinity。无论哪种情况,std::is_finite都可用于检测前哨值是否已更改为实数。

严格来说,不能保证这些值将可用,但实际上它们可能是可用的。当它们可用时,只要您的特殊功能无法返回它们,它们就可以用作哨兵。 (请根据float / double值仔细检查声称“所有实数都是可能的-函数是否可以返回非实数的值?)