2 Dアレイ対入れ子配列

18113 ワード

LeetCode/Hackerrankコードのいくつかの時点で、「2 D配列」というフレーズを見始めます.私たちは私のブートキャンプで入れ子状の配列について多くを学びました、しかし、この他の命名規則は決して来ませんでした.このポストは、私自身の接続を明確にすることです.
入れ子状の配列のアイデアはかなり簡単です.配列を持ち、その配列の中に1つ以上の配列を要素として持ちます.
let myArray = [[1,2,3],[4,5,6]]
その外側の配列の要素にアクセスする場合は、単一のブラケット表記と適切なインデックスを使って呼び出します.
myArray[1]     // [4,5,6]
内部の配列の内の要素を呼び出すには、2番目のブラケットを追加する必要があります.
myArray[1][2]     // 6
数ヶ月間、私はこれらの入れ子状の配列を、あなたが上で見ているように正確に視覚化しました.そして、はい、私はコンピュータは、配列の光学系を気にしないが、非常に視覚的な人であることを理解するための簡単な方法でした.多くの要素を持つ入れ子になった配列でさえ、私は直線で考えました.
let longArray = [[a,f,x,d],[q,l],[m,c,u,t,i],[w],[b,g,o]]
(また、私は、ちょうどどの手紙が一緒によく見えたかについて、あまりにも長くかかりました)
しかし、新しくて怖い2 D配列問題を見始めたとき、彼らはしばしばこのように示されました.
1  6  3  4
2  8  5  0
9  2  7  7
3  5  0  2
これは通常、私の心がシャットダウンしたポイントでした.
この構造には3つの問題があった.
1 )ブラケット( scare factor : 10 )
2)完全な正方形構造
(ネストされている配列には、それぞれの内部配列に異なる要素があります.
3 )非線形[心停止].
先に行き、これらのものを一度に解決しましょう.
ブラケット.
[
  [1, 6, 3, 4],
  [2, 8, 5, 0],
  [9, 2, 7, 7],
  [3, 5, 0, 2]
]
グレート.完了.
〔ここに安堵の溜息を差し込む〕
正方形構造.
はい.入れ子になった配列は、異なる数の要素を持つことができます.技術的には、2 D配列が異なる数の要素を持つことが可能であると仮定します.しかし、私が見たコードの99 %は、アクセスして操作するのが1000倍になっているので、上記のようにグリッド構造に向けられています.それはカラー理論のようです.すべてのピンは赤い家族です、しかし、レッズはピンクの家族の一部と考えられません.二次元配列が正方形または長方形の構造を持つようになるという理由だけでは、それはまだ心に配列している入れ子ではないことを意味しません.
非線形パターン.
[
  [1, 6, 3, 4],
  [2, 8, 5, 0],
  [9, 2, 7, 7],
  [3, 5, 0, 2]
]

[[1, 6, 3, 4],[2, 8, 5, 0],[9, 2, 7, 7],[3, 5, 0, 2]]
文字通り同じこと.
では、なぜグリッドのように書くか?ここがおもしろいところです.私の推測は、グリッド表記法は、より良い可視化(ああ、皮肉)のアクセス方法を支援するために使用されます.
かなり一般的なJavaScriptアルゴリズムを見てみましょう.
for(let i = 0; i < myArray.length; i++){
     for(let j = 0; j < myArray.length; j++{
          //your code here
     }
}
この特定のループが最初の入れ子になった配列のまさしくその始めから始まって、左から右まで各々の内部の配列を通してそのように働きます.これを線形パターンで視覚化するなら、ループアクセスはこのように見えます.
let myArray = [[1, 6, 3, 4],[2, 8, 5, 0],[9, 2, 7, 7],[3, 5, 0, 2]]
//1st element:  myArray[i][j] = myArray[0][0] = 1
//2nd element:  myArray[i][j+1} = myArray[0][1] = 6
//3nd element:  myArray[i][j+2} = myArray[0][2] = 3
ひどい.しかし、いくつかの理由で我々は、各内部配列の最後に起動し、後方を検索する必要がありますか?それからループはこのようになります.
for(let i = 0; i < myArray.length; i++){
     for(let j = myArray.length; j >=0; j--{
          //your code here
     }
}
... そして、対応する結果はこのようになります.
let myArray = [[1, 6, 3, 4],[2, 8, 5, 0],[9, 2, 7, 7],[3, 5, 0, 2]]
//1st element:  myArray[i][j] = myArray[0][3] = 4
//2nd element:  myArray[i][j+1} = myArray[0][2] = 3
//3nd element:  myArray[i][j+2} = myArray[0][1] = 6
ちょっと混乱し始める.最初の配列の最初の要素、2番目の配列の2番目の要素、3番目の3番目の要素をチェックしたいとしましょう.
for(let i = 0, j = 0; i < myArray.length; i++, j++){
     //your code here
}
let myArray = [[1, 6, 3, 4],[2, 8, 5, 0],[9, 2, 7, 7],[3, 5, 0, 2]]
//1st element:  myArray[i][j] = myArray[0][0] = 1
//2nd element:  myArray[i][j+1} = myArray[1][1] = 8
//3nd element:  myArray[i][j+2} = myArray[2][2] = 7
あなたがあなたの入れ子状の配列について線形ファッションで考えているならば、それは熱い混乱のようです.しかし、それを2 Dいとこに変えてください..
[
  [1, 6, 3, 4],
  [2, 8, 5, 0],
  [9, 2, 7, 7],
  [3, 5, 0, 2]
]
...そして突然、それはあなたが正方形で斜めに沿って行っていることは非常に明らかになります.
さて、2次元配列のGoogleチュートリアルでは、「行」と「列」について一貫して話すことがわかります.あなたが格子を見ているとき、それは完全な感覚を作ります.しかし、また、入れ子状の配列について考えるとき、それは少し混乱しています.JavaScriptの入れ子になったループの最初の例を見てみましょう.
for(let i = 0; i < Arr.length; i++){
     for(let j = 0; j < Arr.length; j++{
          //your code here
     }
}
このアルゴリズムの“i”は、外側の配列のインデックスを表します.これらは行です.
// Arr[i]
     [                                
          [1,   6,   3,   4],         // Arr[0]
          [2,   8,   5,   0],         // Arr[1]
          [9,   2,   7,   7],         // Arr[2]
          [3,   5,   0,   2]          // Arr[3]
     ]
内部の配列のインデックスは“j”である.
//                 [j]        [j]        [j]        [j]
//           Arr[i][0]  Arr[i][1]  Arr[i][2]  Arr[i][3]
           [                                           
                  [1,        6,        3,        4],   
                  [2,        8,        5,        0],   
                  [9,        2,        7,        7],   
                  [3,        5,        0,        2]    
          ]
私の頭を包むためにしばらく私を取ったものは「i」と「j」のためのデータ型が同じでないということです.iのデータ型は配列です.“j”のデータ型は、配列内の要素(通常これらのコーディング課題を持つ番号)です.開いた格子構造でそれを見ることができません.彼らはすべての数字のように見える.
私は、これが少し役立つことを望みます?2次元配列についての私自身の理解を固めるのを確実に助けてくれました.だからどこかに置いてくれてありがとう.
幸運の最高!