1. ホーム
  2. ruby

Rubyで2次元配列の作成と部分配列へのアクセス

2023-09-02 22:31:04

質問

2次元の配列を作成し、その中の任意の水平または垂直サブ配列に素早くアクセスする可能性はあるのでしょうか?

以下のようなケースで、水平方向の部分配列にアクセスできると思います。

x = Array.new(10) { Array.new(20) }

x[6][3..8] = 'something'

しかし、私が理解する限り、このようにアクセスすることはできません。

x[3..8][6]

この制限を回避したり、ハックしたりするにはどうしたらよいでしょうか?

どのように解決するのですか?

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) であり、したがって collect はほとんど O(n) で実行される。n個の要素をコピーするのは常にO(n)なので、O(n)より速くする方法はありません。

Hashes は、大きくなりすぎると問題が発生する可能性があります。ですから、私は多次元的な Array のような多次元的な実装は、データ量が大きくなることが分かっている場合は、よく考える必要があります。