编辑:显然我问错了这个问题。在结束投票之前,请让我知道问题所在。我向你保证,这不是一个无法回答的问题。您随时可以回来投票以将其关闭。
我目前正在使用C ++,但是我认为这个问题适用于大多数编译语言。
在我的项目中,我有一组值,这些值是单独计算的,一次一次,一次尽可能晚地基于单个变量计算。这些值不是一次全部计算,而是仅在需要时才计算。与通常使用“脏”时一样,目标是将某些事物标记为需要更新,而不是先行更新。这些值反复循环,因此,如果可能的话,我想缓存计算。每当单个变量更改时,所有值都应标记为脏,以便循环知道在存储和继续之前要重新计算。
我可以想到几种实现此目的的方法,但是我不确定哪种方法最有效:
以上只是我想到的第一件事,但是我对c ++还是很陌生,希望对将数组标记为脏的常规或特殊解决方案有所了解。
如何有效弄脏阵列?
为了显示代码示例,我将显示我更习惯的js:
const numbers = [];
const clean = [];
let length = 1000;
let variable;
const setVariable(num) => {
variable = num;
for (let i = 0; i < length; i++) { clean[i] = false; }
}
setVariable(42);
let pos = 0;
while (true) {
if (clean[pos] == false) {
clean[pos] = true;
numbers[pos] = someIntensiveMath(pos, variable);
}
doSomethingWithNumbers(numbers[pos]);
pos++;
if (pos >= length) pos = 0;
// wait a bit;
}
在js中,您也可以这样做
const setVariable(num) => {
variable = num;
numbers = [];
}
const isDirt = numbers[pos] === undefined;
使用js时,由于脚本的本机实现,后者可能会更快,但我认为编译语言不是这种情况。我认为你们做事的方式不同。
答案 0 :(得分:1)
我在其他地方发现,标记数组“脏”条目的典型方法是使用并行的布尔数组。
@stark在评论中提到了使用地图的想法,并且两者的速度比较似乎相当不错,但在以下答案中建议使用索引数组。
由于“脏”是未知的,现代编码的变化是否导致了一种新的事实上的方式来标记项目或数组的一部分(或项目的线性集合)。但至少,作为回答,最直接的nooby方法是使用并行的布尔数组。
此外,根据您遍历“数组”的方式,使用矢量或映射可能很有意义。在任何一种情况下,最好通过清除图或删除矢量项来完成脏污的形式。
因此,要给出最佳答案,似乎应该首先找到最适合其需求的存储方法,然后再使用最合适的存储方法。
对于数组,正如针对此问题所指出的,并行数组似乎是答案。