每当我使用动态编程用解决方案编写代码时,我的代码就会看起来像这样:
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
。但是现在我正在编写一个代码,该函数可以返回所有实数。因此,我该如何选择该值,或者应该更改方法。
答案 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 数字都是可能的。既好又坏。不好是因为一台计算机不能代表每个实数,但是大概已经考虑了这一点。很好,因为大多数用于表示实数的方法都包含一些不是实数的值。最明显不是实数的float
或double
值是NaNs(不是数字)。另一个选项是infinity。无论哪种情况,std::is_finite
都可用于检测前哨值是否已更改为实数。
严格来说,不能保证这些值将可用,但实际上它们可能是可用的。当它们可用时,只要您的特殊功能无法返回它们,它们就可以用作哨兵。 (请根据float
/ double
值仔细检查声称“所有实数都是可能的-函数是否可以返回非实数的值?)