代码之家  ›  专栏  ›  技术社区  ›  Seph Reed

如何有效地修复阵列的脏部分?[闭门]

  •  -4
  • Seph Reed  · 技术社区  · 7 年前

    编辑:显然我问错了这个问题。在投票结束之前,请允许我知道问题遗漏了什么。我向你保证,这不是一个无法回答的问题。你可以随时回来投票,稍后再关闭它。

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

    在我的项目中,我有一个单独计算的值数组,一次一个,基于单个变量尽可能晚地计算。这些值不是一次全部计算的,它们是在且仅在需要时计算的。与使用“dirty”时通常的情况一样,目标是将某些东西标记为需要更新,而不是抢先更新。这些值被一次又一次地循环,所以如果可能的话,我想缓存计算。每当单个变量发生变化时,所有值都应标记为脏值,以便循环知道在存储和继续之前重新计算。

    我可以想出一些方法来实现这一点,但我不确定什么是最有效的:

    1. 有两个数组,一个是布尔数组,一个是值数组。将所有布尔值标记为false(如果脏),将其标记为true(如果干净)。
    2. 全新的阵列。只需创建一个新数组,如果有任何项未设置,请设置它们。这一个似乎会有很多问题,但这是一个想法。
    3. 也许可以使用一些内置类来实现这些功能?

    如何有效地脏化阵列?

    为了展示一个代码示例,我将展示我比较习惯的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 回复  |  直到 7 年前
        1
  •  1
  •   Seph Reed    7 年前

    @斯塔克在评论中提到了使用地图的想法,两种方法的速度比较似乎相当不错,但在下面的回答中建议使用数组作为索引项。

    performance of array vs. map

    此外,根据您在“数组”中迭代的方式,使用vector或map可能是有意义的。在这两种情况下,最好通过清除地图或删除向量条目(??)来实现弄脏的形式。

    因此,为了给我最好的答案,人们应该首先找到最适合他们需要的存储方法,然后使用最正常的方法。

    对于数组,正如前面提到的问题,并行数组似乎是答案。