从出生开始,我一直被教导要避免嵌套数组,如性能和内部数据结构原因的瘟疫。因此,我正在尝试为Ruby中的优化多维数据结构找到一个很好的解决方案。
典型的解决方案可能涉及使用1D阵列并通过x*width + y
访问每个阵列。
Ruby能够重载[]
运算符,因此一个好的解决方案可能涉及使用multi_dimensional_array[2,4]
甚至使用splat来支持任意维量。 (但实际上,我只需要两个维度)
这里有库/宝石吗?如果没有,那么写这篇文章的最佳方式是什么?
我的嵌套数组查找现在是我的计算密集型脚本的 瓶颈,所以这是重要的,而不是过早优化的情况。
如果有帮助,我的脚本主要使用随机查找和较少的遍历。
答案 0 :(得分:4)
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']
)。这可能会导致更快的“随机访问”时间,但您需要对其进行分析才能确定。
您是否有机会发布一些有问题的代码?了解问题代码将使我们更容易推荐解决方案。