Есть некоторые проблемы с 2-мерным Arrays
способом их реализации.
a= [[1,2],[3,4]]
a[0][2]= 5 # works
a[2][0]= 6 # error
Hash
как 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] }
(a..b).to_a
работает в O (n). Извлечение элемента из Hash
почти равно O (1), поэтому сбор выполняется почти за O (n). Невозможно сделать это быстрее, чем O (n), поскольку копирование n элементов всегда равно O (n).
Hashes
могут возникнуть проблемы, когда они становятся слишком большими. Поэтому я бы дважды подумал о реализации многомерного Array
, подобного этому, если бы знал, что объем моих данных становится большим.