通过用赢家的副本替换输家来更新“玩家”的网格

时间:2013-05-21 12:41:26

标签: algorithm

我有一个二维的对象数组。每个对象在任何时候都具有一些(可变的)分数(即,在时间t的对象的分数不一定是在时间t + 1的对象的分数)。我想找到最有效的算法,它将复制任何比其邻居更高分数的对象,并将该副本放入邻居的位置。 1

我的第一个冲动是天真的解决方案:

  • 创建数组的副本
  • 将“changeWasMade”标志设置为false
  • 循环通过所有位置p
    • 与所有邻居n
    • 比较得分
    • 如果得分(p)>得分(n),用复制品p替换复制网格中的n并将“changeWasMade”设置为true
  • 如果“changeWasMade”,则丢弃原始网格,并重复使用该副本作为新原始;否则,返回副本

然而,对于nxn数组,这似乎是O(n 4 )(n 2 可能的n 2 检查的迭代次数) ,这对我来说似乎很慢。由于我的算法知识非常差,我认为问一下这种方法是否更快是明智的。

更新

我刚刚想到,更换一次“通过”可能会更快,然后检查所有新创建的(即克隆的)对象是否具有其邻居的最高分数(即,是局部最大值)。如果他们是伟大的,那么正确的事情发生了 - 如果他们不是,那么用一份得分最高的邻居替换他们。这可能会减少所需的迭代次数(虽然它需要一些好的簿记才能保持一切顺利!) - 还有更快的方法吗?

**脚注**

  1. (在某些情况下,对于那些阅读过“量子小偷”的人来说,这是在开篇页面中描述的监狱设置)

1 个答案:

答案 0 :(得分:3)

除非我错误地阅读了这个问题,否则显而易见的解决办法似乎是:

  1. 创建一个相同大小的空白数组,调用旧数组old和新数组new
  2. 对于新数组中的每个单元格new[i][j],请将其设置为五个可能值中的最大值:old[i][j]old[i-1][j]old[i][j-1]old[i+1][j]old[i][j+1]
  3. new现在是时间步长t + 1的更新数组。