programing

2 차원 배열을 만들고 Ruby에서 하위 배열에 액세스

nasanasas 2020. 11. 13. 08:21
반응형

2 차원 배열을 만들고 Ruby에서 하위 배열에 액세스


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_aO (n)에서 실행됩니다. 에서 요소를 검색하는 Hash것은 거의 O (1)이므로 수집은 거의 O (n)에서 실행됩니다. n 개의 요소를 복사하는 것은 항상 O (n)이기 때문에 O (n)보다 빠르게 만들 수있는 방법은 없습니다.

Hashes너무 커지면 문제가 생길 수 있습니다. 따라서 Array데이터 양이 커지고 있다는 것을 알고 있다면 이와 같은 다차원 구현에 대해 두 번 생각할 것 입니다.


rows, cols = x,y  # your values
grid = Array.new(rows) { Array.new(cols) }

요소에 액세스하는 것과 관련하여이 문서는 원하는 방식으로 배열을 캡슐화하는 단계별 방법에 매우 적합합니다.

루비 배열 방법


실제 목표를 밝히지 않았지만 도움이 될 수 있습니다.

require 'matrix'  # bundled with Ruby
m = Matrix[
 [1, 2, 3],
 [4, 5, 6]
]

m.column(0) # ==> Vector[1, 4]

(벡터는 배열처럼 작동합니다)

또는 원하는대로 유사한 표기법을 사용합니다.

m.minor(0..1, 2..2) # => Matrix[[3], [6]]

다음은 3D 배열 사례입니다.

class Array3D
   def initialize(d1,d2,d3)
    @data = Array.new(d1) { Array.new(d2) { Array.new(d3) } }
   end

  def [](x, y, z)
    @data[x][y][z]
  end

  def []=(x, y, z, value)
    @data[x][y][z] = value
  end
end

다른 Ruby 배열과 마찬가지로 각 배열의 하위 섹션에 액세스 할 수 있습니다. @data [0..2] [3..5] [8..10] = 0 등


x.transpose[6][3..8]또는 x[3..8].map {|r| r [6]}당신이 원하는 것을 줄 것입니다.

예:

a = [ [1,  2,  3,  4,  5],
      [6,  7,  8,  9,  10],
      [11, 12, 13, 14, 15],
      [21, 22, 23, 24, 25]
    ]

#a[1..2][2]  -> [8,13]
puts a.transpose[2][1..2].inspect   # [8,13]
puts a[1..2].map {|r| r[2]}.inspect  # [8,13]

I'm quite sure this can be very simple

2.0.0p247 :032 > list = Array.new(5)

 => [nil, nil, nil, nil, nil] 

2.0.0p247 :033 > list.map!{ |x| x = [0] }

 => [[0], [0], [0], [0], [0]] 

2.0.0p247 :034 > list[0][0]

  => 0

a = Array.new(Array.new(4))

0.upto(a.length-1) do |i|
  0.upto(a.length-1) do |j|
    a[i[j]] = 1
  end
end

0.upto(a.length-1) do |i|
  0.upto(a.length-1) do |j|
    print a[i[j]] = 1 #It's not a[i][j], but a[i[j]]
  end
  puts "\n"
end

Here is the simple version

 #one
 a = [[0]*10]*10

 #two
row, col = 10, 10
a = [[0]*row]*col

Here is an easy way to create a "2D" array.

2.1.1 :004 > m=Array.new(3,Array.new(3,true))

=> [[true, true, true], [true, true, true], [true, true, true]]

참고URL : https://stackoverflow.com/questions/1720932/create-two-dimensional-arrays-and-access-sub-arrays-in-ruby

반응형