Un fragment de prelegere cu un mentor ca parte a cursului Universității Codegym. Înscrie-te la cursul complet.


„Salutări, Amigo!”

— Bună, Rishi!

„Știi deja un lucru sau două despre matrice și chiar ai reușit să rezolvi niște sarcini, sper. Dar nu știi totul. De exemplu, iată un alt fapt interesant despre matrice. Matricele nu sunt doar unidimensionale (liniare). ). Ele pot fi, de asemenea, bidimensionale."

— Hm... Ce înseamnă asta?

„Aceasta înseamnă că celulele matricei pot reprezenta nu numai o coloană (sau un rând), ci și un tabel dreptunghiular.

int[][]name = new int[width][height];

„Unde nume este numele variabilei matricei, lățimea este lățimea tabelului (în celule) și înălțimea este înălțimea tabelului. Aruncă o privire la un exemplu:

int[][] data = new int[2][5];
data[1][1] = 5;
Creăm o matrice bidimensională: 2 coloane și 5 rânduri.
Scriem 5 în celula (1,1).

„Așa va arăta în memorie:

Matrice bidimensionale

„Apropo, pentru matricele bidimensionale, puteți folosi și inițializarea rapidă:

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

"Hmm... acum asta e interesant. Dacă ne imaginăm că în primele paranteze interioare reprezintă un element, următorul este un al doilea... Deci o matrice bidimensională este ca o matrice de matrice?"

„Ce student deștept ești! Exact. Primul element este matricea unidimensională {31, 28, 31}, al doilea este {30, 31, 30}și așa mai departe. Dar vom reveni la asta puțin mai târziu în această lecție. Până atunci, încearcă să te gândești la o matrice bidimensională ca un tabel cu rânduri și coloane, formând celule la fiecare intersecție.

"Am o imagine mentală despre asta. Apropo, la ce sunt folosite, aceste matrice bidimensionale?"

„Programatorul are nevoie de matrice bidimensionale destul de des. Dacă te uiți cu atenție, aproape orice joc de societate este implementat folosind o matrice bidimensională disponibilă: șah, dame, tic-tac-toe, bătălie pe mare etc.:”

bătălie pe mare

"Am înțeles! Terenul de joc al șahului sau al bătăliei pe mare se potrivește perfect pe matrice bidimensionale!"

„Da, dar trebuie să folosiți numere ca coordonate ale celulei. Nu „pion e2-e4”, ci „pion (5,2) -> (5,4)”. Vă va fi și mai ușor ca programator. "

Aranjarea elementelor în matrice: (x, y) sau (y, x)

„Crearea de tablouri bidimensionale ridică o dilemă interesantă. Când creăm o matrice folosind new int [2][5];, avem un tabel cu „două rânduri și 5 coloane ” sau este „două coloane și 5 rânduri”?”

„Cu alte cuvinte, nu este complet clar dacă mai întâi specificăm lățimea și apoi „înălțimea... sau invers, mai întâi înălțimea și apoi lățimea?”

"Da, aceasta este dilema. Și nu există un răspuns cert."

"Ce să fac?"

„În primul rând, este important să înțelegem modul în care matricea noastră bidimensională este de fapt stocată în memorie . Desigur, memoria computerului nu are de fapt nici un tabel în ea: fiecare locație din memorie are o adresă numerică secvențială: 0, 1, 2, ... Pentru noi, acesta este un tabel de 2 × 5, dar în memorie este doar 10 celule, nimic mai mult. Fără diviziune în rânduri și coloane."

"Am înțeles asta. Cum determinăm atunci care dimensiune este prima - lățimea sau înălțimea?"

„Să luăm în considerare prima opțiune. Mai întâi lățimea, apoi înălțimea. „Argumentul în favoarea acestei abordări este acesta: toată lumea învață matematică la școală și învață că perechile de coordonate sunt scrise ca „x” (adică axa orizontală) și apoi „y” (dimensiunea verticală). Și acesta nu este doar un standard școlar - este un standard general acceptat în matematică. După cum se spune, nu te poți certa cu matematica.”

"Așa este? Ei bine, dacă nu putem lupta, atunci mai întâi lățimea și apoi înălțimea?"

„Există un argument interesant în favoarea „înălțimii mai întâi, apoi lățimii” . Acest argument vine de la inițializarea rapidă a matricelor bidimensionale. La urma urmei, dacă vrem să inițializam matricea noastră, atunci scriem cod astfel:”

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

— Deci, ce ne face asta?

"Ai observat ceva? Dacă avem asta?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

„Dacă ne scriem datele în cod linie cu linie, atunci obținem un tabel cu 2 rânduri și 5 coloane.”

"Acum înțeleg. 2 este înălțimea, iar 5 este lățimea... Deci, ce opțiune ar trebui să folosim?"

"Decideți de dvs. care este mai convenabil. Cel mai important lucru este ca toți programatorii care lucrează la același proiect să respecte aceeași abordare."

„Dacă lucrați la un proiect al cărui cod are o mulțime de matrice bidimensionale inițializate, atunci cel mai probabil totul se va baza pe o inițializare rapidă a datelor, adică veți avea standardul „înălțime x lățime”.

„Dacă te afli într-un proiect care implică multă matematică și lucrează cu coordonate (de exemplu, motoare de joc), atunci codul va adopta cel mai probabil abordarea „lățime x înălțime”.

Cum sunt aranjate tablourile bidimensionale

„Acum, vă amintiți caracteristica specială a tablourilor bidimensionale pe care ați observat-o la începutul lecției?”

"Da! Era că tablourile bidimensionale sunt de fapt matrice de matrice!"

„Destul de corect. „Cu alte cuvinte, dacă în cazul unui tablou obișnuit o variabilă de matrice stochează o referință la un container care stochează elemente de matrice, atunci în cazul matricelor bidimensionale situația explodează puțin: o bidimensională. -variabila matrice stochează o referință la un container care stochează referințe la matrice unidimensionale. Este mai bine să o vezi în acțiune o dată, decât să încerci să o explic de o sută de ori:”

Cum sunt aranjate tablourile bidimensionale

„În stânga , avem o variabilă de matrice bidimensională, care stochează o referință la un obiect matrice bidimensională. În mijloc există un obiect matrice bidimensională ale cărui celule stochează matrice unidimensionale, care sunt rânduri ale unei matrice bidimensionale. Și în dreapta , puteți vedea patru matrice unidimensionale - rândurile matricei noastre bidimensionale. Acesta este modul în care funcționează de fapt matricele bidimensionale."

"Fantastic! Dar ce ne oferă?"

„Deoarece un „container de containere” stochează referințe la „matrice de rânduri”, putem schimba foarte rapid și ușor rândurile. Pentru a obține un „container de containere”, trebuie doar să specificați un index în loc de doi. Exemplu:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

„Uită-te la codul de mai jos. Îl putem folosi pentru a schimba rândurile:”

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
Matricea bidimensională





matrix[0]stochează o referință la primul rând.
Schimbăm referințele.

Ca rezultat, matrixmatricea arată astfel:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

"Am înțeles. Funcționează ca și cum ai schimba oricare două articole obișnuite."

„Așa este. Ei bine, dacă vă referiți la o celulă dintr-o matrice bidimensională, dar specificați doar un index după numele matricei, atunci vă referiți la un container de containere ale căror celule stochează referințe la unul obișnuit... matrice dimensionale”.

"Totul pare logic și clar. Mulțumesc pentru prelegere, Rishi!"

"Ești binevenit. Pune-o în practică cu înțelepciune."