查找2个巨大数组

时间:2017-01-23 21:49:56

标签: arrays algorithm multidimensional-array

为了简单起见,我将一个非常大的2D空间映射到一个简单的位数组(实际上它是大约200k的成员)。

现在让我们说我运行一个小型算法来绘制一个"圈"给出中心点和半径的1 s。

这是一个示例,左侧绘制了一个圆圈,在下一次计算中,它的中心向上移动了1。

0000000        0001000
0001000        0011100
0011100    ->  0011100
0011100        0001000
0001000        0000000
0000000        0000000

现在我有很多这些地图的图层,在我计算出来之后,我需要"展平"它们(有点像Photoshop混合图层选项) - 目前我每次都在整个阵列上进行迭代并组合整个阵列 - 尽管其中95%都没有真正改变。

Psuedo代码

for(int x = 0; x < width; x++)
   for(int y = 0; y < height; y++)
      int index = x + y * width
      result[index] = layer1[index] * layer2[index]

这非常低效,我需要提高我的表现。

更新:我们最终做了什么

稀疏矩阵完全我们需要的东西,我们最终使用最适合我们使用的键字典(DOK)(动态构建每一层和&# 34;混合&#34;他们在一起)。

我们提出的解决方案是使用3个阵列:

  1. float数组,大小为我们可能拥有的最大成员数(值)
  2. 位数组(大小相同),标记值数组中的哪个成员有效
  3. int数组(大小相同),保存值数组中使用的索引(稍后再迭代)+增量int,用作指向索引数组中成员数量的指针
  4. 由于我们的需求严重依赖于内存使用和CPU,我们将每个稀疏矩阵包装成双缓冲区形式,以便不为每个混合生成新数组。

    最终,这个解决方案为我们带来了x15-x20更好的CPU结果(比我们之前的天真蛮力方法),并且在内存方面我们将RAM使用率降低了大约98%。

1 个答案:

答案 0 :(得分:1)

根据我的理解,并使用photoshop图层类比:

你有你的潜在“图像”,存储为“密集的”2D阵列,当然,因为这是你的数据,每个“像素”都很重要。到目前为止一切都很好。

额外的图层代表更改:当表示为2D数组时,其条目的几乎所有都将为零。

在这种情况下,您需要查看稀疏矩阵表示:您只需存储记录非坐标的元组sudo yum install python-devel 列表,而不是存储完整的2D数组。 - 零细胞。

这样,在这些矩阵上运行的任何算法都将按照有多少非零的顺序运行,而不是基于矩阵的总条目数。