Ruby中优化的“多维”数组

时间:2010-09-08 23:52:17

标签: ruby data-structures multidimensional-array

从出生开始,我一直被教导要避免嵌套数组,如性能和内部数据结构原因的瘟疫。因此,我正在尝试为Ruby中的优化多维数据结构找到一个很好的解决方案。

典型的解决方案可能涉及使用1D阵列并通过x*width + y访问每个阵列。

Ruby能够重载[]运算符,因此一个好的解决方案可能涉及使用multi_dimensional_array[2,4]甚至使用splat来支持任意维量。 (但实际上,我只需要两个维度)

这里有库/宝石吗?如果没有,那么写这篇文章的最佳方式是什么?

我的嵌套数组查找现在是我的计算密集型脚本的 瓶颈,所以这是重要的,而不是过早优化的情况。

如果有帮助,我的脚本主要使用随机查找和较少的遍历。

3 个答案:

答案 0 :(得分:4)

narray

  

NArray是一个数值N维   数组类。支持的元素类型   是1/2/4字节的整数,   单/双精度真/复,   和Ruby对象。这个扩展   库包含快速计算   而且容易操纵大   数值数组进入Ruby   语言。 NArray具有类似的功能   到NumPy,但是NArray有矢量和   矩阵子类。

答案 1 :(得分:2)

嵌套数组如果正确遍历它们并不坏,这意味着首先遍历行然后遍历列。这应该很快。如果您经常需要某个元素,则应将该值存储在变量中。否则你会在内存中跳跃,这会导致糟糕的表现。

大规则:不要在嵌套数组中跳转尝试从一行到另一行遍历它。

答案 2 :(得分:2)

您可以从Array继承并创建自己的类来模拟多维数组(但内部是一个简单的1维数组)。你可能会从中看到一些加速,但如果不编写代码并分析它就很难说。

您可能还想尝试NArray课程。

除此之外,您的嵌套数组查找可能不是它们看起来真正的瓶颈。有几次,我遇到了同样的问题,后来发现重写我的一些逻辑清除了瓶颈。它不仅仅是加速嵌套查找,而是最大限度地减少所需的查找次数。 n - 维数组中的每个“随机访问”都需要n个查找(每个嵌套数组级别一个)。您可以使用以下代码迭代维度来减少这种情况:

array.each {|x|
    x.each {|y|
        y.each {|z|
            ...
        }
    }
}

这允许您在第一维中执行单个查找,然后访问“后面”的所有内容,然后访问第二维中的单个查找等。这将导致查找比随机访问元素少得多。

如果您需要随机元素访问,则可能需要尝试使用哈希。您可以获取数组索引,将它们作为字符串连接在一起,并将其用作哈希键(例如,array[12][0][3]变为hash['0012_0000_0003'])。这可能会导致更快的“随机访问”时间,但您需要对其进行分析才能确定。

您是否有机会发布一些有问题的代码?了解问题代码将使我们更容易推荐解决方案。

相关问题