Deo zbornika Učimo algoritme

Matrice

Matrica ili dvodimenzionalni niz je niz čiji su elementi jednodimenzionalni nizovi.

Matricu možemo predstaviti kao tabelu koja ima m redova i n kolona, sa ćelijama označenim indeksima. Na primer, matricu veličine a[3][4] bi tabelarno predstavili na sledeći način:

Zapis matrice

U većini programskih jezika, matrice zapisujemo nizovima unutar niza. Vrednostima pristupamo pomoću dva indeksa, od kojih prvi predstavlja red, a drugi kolonu. Sledi zapis matrice u jeziku Javascript:

const mapa = [
  [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
  [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
  [ 1, 0, 0, 2, 0, 1, 1, 1, 0, 1 ],
  [ 1, 0, 2, 0, 0, 0, 0, 1, 0, 1 ],
  [ 1, 0, 0, 0, 0, 1, 0, 1, 1, 1 ],
  [ 1, 0, 1, 1, 0, 0, 0, 0, 0, 1 ],
  [ 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 ],
  [ 1, 1, 0, 1, 0, 0, 0, 1, 1, 1 ],
  [ 1, 0, 0, 1, 0, 1, 0, 0, 0, 3 ],
  [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
]

console.log(mapa[2][3])

U jeziku C, dvodimenzionalni nizovi se mogu inicijalizovati slično kao jednodimenzionalni, dodelom vrednosti svim elementima na sledeći način:

int matrica[3][4] = {
    {0, 1, 2, 3} ,    /*  inicijalizacija reda sa indeksom 0 */
    {4, 5, 6, 7} ,    /*  inicijalizacija reda sa indeksom 1 */
    {8, 9, 10, 11}    /*  inicijalizacija reda sa indeksom 2 */
};

Pošto su elementi niza opet nizovi, imamo ugnježdene vitičaste zagrade.

Alokacija memorije

Na primer u jeziku C, sledeća matrica smeštena u dvodimenzionalni niz

int matrica[10][15]

bi rezervisala prostor za 10 * 15 odnosno 150 varijabli tipa int.

Prolazak kroz matricu

Pošto za prolazak kroz niz treba jedna petlja, za prolazak kroz dvodimenzionalni niz potrebne su dve petlje, jedna unutar druge:

const matrica = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

for (let i = 0; i < matrica.length; i++) {
  for (let j = 0; j < matrica[i].length; j++) {
    console.log(matrica[i][j])
  }
}

Kvadratna matrica

Matrice s istim brojem redova i kolona nazivaju se kvadratne. Kvadratne matrice imaju glavnu i sporednu dijagonalu. Glavna dijagonala počinje od prvog elementa prvog reda i završava se na poslednjem elementu poslednjeg reda. Sporedna dijagonala seče glavnu dijagonalu tako da prave slovo X.

Ispis glavne dijagonale

Na glavnoj dijagonali kvadratne matrice nalaze se elementi za koje vredi i == j. Naivni algoritam za ispis glavne dijagonale, sa petljom unutar petlje (n^2), ovako bi izledao u Javascriptu:

const matrica = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

for (let i = 0; i < matrica.length; i++) {
  for (let j = 0; j < matrica[i].length; j++) {
    if (i == j) console.log(matrica[i][j])
  }
}

Optimalan algoritam za ispis glavne dijagonale, sa samo jednim prolaskom (n), bio bi:

const matrica = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

for(let i = 0; i < matrica.length; i++)
  console.log(matrica[i][i])

Ispis sporedne dijagonale

Na sporednoj dijagonali nalaze se elementi za koje vredi i + j == n - 1 (n je dužina matrice). Skup i naivan algoritam za ispis sporedne dijagonale, bi ovako izledao u Javascriptu:

const matrica = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]
const n = matrica.length

for (let i = 0; i < n; i++) {
  for (let j = 0; j < n; j++) {
    if (i + j == n - 1) console.log(matrica[i][j])
  }
}

Optimalan algoritam, sa samo jednim prolaskom, bio bi:

const matrica = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]
const n = matrica.length

for(let i = 0; i < n; i++)
  console.log(matrica[i][n - i - 1])