如何有效地弄脏阵列的各个部分?

时间:2018-12-14 18:38:18

标签: c++ arrays

编辑:显然我问错了这个问题。在结束投票之前,请让我知道问题所在。我向你保证,这不是一个无法回答的问题。您随时可以回来投票以将其关闭。

我目前正在使用C ++,但是我认为这个问题适用于大多数编译语言。

在我的项目中,我有一组值,这些值是单独计算的,一次一次,一次尽可能晚地基于单个变量计算。这些值不是一次全部计算,而是仅在需要时才计算。与通常使用“脏”时一样,目标是将某些事物标记为需要更新,而不是先行更新。这些值反复循环,因此,如果可能的话,我想缓存计算。每当单个变量更改时,所有值都应标记为脏,以便循环知道在存储和继续之前要重新计算。

我可以想到几种实现此目的的方法,但是我不确定哪种方法最有效:

  1. 具有两个数组,一个为布尔值,另一个为值。将所有布尔值标记为false(如果脏),将其标记为true(干净)。
  2. 有一个干净的起点。考虑所有脏污,直到再次通过该循环点。缺点是不允许跳过循环条目。
  3. 全新阵列。只需创建一个新数组,如果未设置任何项,请设置它们。这似乎有很多问题,但这是一个想法。
  4. 也许使用一些内置类来表示这些东西?

以上只是我想到的第一件事,但是我对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时,由于脚本的本机实现,后者可能会更快,但我认为编译语言不是这种情况。我认为你们做事的方式不同。

1 个答案:

答案 0 :(得分:1)

我在其他地方发现,标记数组“脏”条目的典型方法是使用并行的布尔数组。

@stark在评论中提到了使用地图的想法,并且两者的速度比较似乎相当不错,但在以下答案中建议使用索引数组。

performance of array vs. map

由于“脏”是未知的,现代编码的变化是否导致了一种新的事实上的方式来标记项目或数组的一部分(或项目的线性集合)。但至少,作为回答,最直接的nooby方法是使用并行的布尔数组。

此外,根据您遍历“数组”的方式,使用矢量或映射可能很有意义。在任何一种情况下,最好通过清除图或删除矢量项来完成脏污的形式。

因此,要给出最佳答案,似乎应该首先找到最适合其需求的存储方法,然后再使用最合适的存储方法。

对于数组,正如针对此问题所指出的,并行数组似乎是答案。