我想知道是否有可能创建一个二维数组,并快速访问其中的任何水平或垂直子数组?
我相信我们可以在以下情况下访问水平子数组:
x = Array.new(10) { Array.new(20) }
x[6][3..8] = 'something'
但据我所知,我们不能这样访问它:
x[3..8][6]
我如何避免或破解这个限制?
我想知道是否有可能创建一个二维数组,并快速访问其中的任何水平或垂直子数组?
我相信我们可以在以下情况下访问水平子数组:
x = Array.new(10) { Array.new(20) }
x[6][3..8] = 'something'
但据我所知,我们不能这样访问它:
x[3..8][6]
我如何避免或破解这个限制?
二维Arrays
的实现方式存在一些问题.
a= [[1,2],[3,4]]
a[0][2]= 5 # works
a[2][0]= 6 # error
Hash
as Array
我更喜欢用Hashes
来表示多维Arrays
a= Hash.new
a[[1,2]]= 23
a[[5,6]]= 42
这样做的优点是,不必手动创建列或行.插入到散列中几乎是O(1),所以这里没有缺点,只要Hash
不会变得太大.
甚至可以为所有未指定的元素设置默认值
a= Hash.new(0)
那么现在关于如何获得子数组
(3..5).to_a.product([2]).collect { |index| a[index] }
[2].product((3..5).to_a).collect { |index| a[index] }
在O(n)中运行(a..b).to_a
次.从Hash
中检索一个元素几乎是O(1),因此collect几乎以O(n)的形式运行.没有办法使它比O(n)快,因为复制n个元素总是O(n).
当他们变得太大时,Hashes
人可能会有问题.所以,如果我知道自己的数据量越来越大,我会三思而后行,实现这样一个多维Array
.