アジの開きを閉じる。

競プロ(AtCoder)中心のブログ

2次元配列を1次元配列に落とし込む場合のindex対応

2次元配列を1次元配列で管理したいときに悩みがちなindex対応の考え方についてです。

毎回詰まるので備忘録として。

パパッと対応を書けたらカッコイイですね~(自分だけ?)

執筆時レート:

 

目次

 

 

やりたいこと

H行 × W列の2次元配列A[i][j]を1次元配列B[ind]で管理するときに、組(i, j)と対応するindを求めたい!

 

 

 

結論

  • ind = iW + j

実は、n進法→10進法に変換する考え方と同じ。

 

導出

配列A, Bのindex対応はこんな感じ。

 

 

上から順番に見ていくと、indが1増えるにつれてjが1増える。そしてjがW-1になると次は0に戻り、iが1増える。

これは10進法において、9に1を足すと位が一つ上がり10になる構造と同じである。

つまり、

  • j: 1の位
  • i: Wの位

と考えることが出来る。

 

 

以上の考察から、indの表し方はn進法→10進法に変換するときと同様に考えて、

  • ind = iW + j

となることが分かる。

 

ちなみに、indからi, jを求めたいときは、i, jはそれぞれindWで割った商、余りであるので、

  • i = ind / W
  • j = ind % W

となる。

 

3次元配列⇄1次元配列の場合

同様の考え方で、L × H × Wの3次元配列A[i][j][k]を1次元配列B[ind]で管理する場合のindex対応も分かる。

 

 

各添え字は次のように捉えられる。

  • k: 1の位
  • j: Wの位
  • i: HWの位

よって、

  • ind = iHW + jW + k