Sunteți pe pagina 1din 66

Facultatea de Matematica si Informatica

Universitatea din Bucuresti

Tablouri

Operatii pe tablouri bidimensionale

Lectii de pregatire pentru Admitere

07 / 03 / 2020

1
Facultatea de Matematica si Informatica
Universitatea din Bucuresti

Operatii pe tablouri bidimensionale

Cuprins

0. Tablouri unidimensionale – scurta recapitulare

1.Tablouri bidimensionale – notiuni teoretice

2.Tablouri bidimensionale - Aplicatii

2
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
0. Tablouri unidimensionale – scurta recapitulare
C / C++ Declarare Pascal

int a[20]; var a : array [1..20] of integer;


double b[30]; var b : array [1..30] of double;
char c[23]; var c : array [1..23] of char;

0.3 -1.2 10 5.7 ... 0.2 -1.5 1


double tab [100] ; tab [3] = 5.7;
0 1 2 3 97 98 99

int a[5]; 3 -12 10 7 1 a [1] = -12;


0 1 2 3 4

A & * + ... c M #
char b1 [34]; b1 [1] = ‘&’;
0 1 2 3 …

3
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
0. Tablouri unidimensionale – scurta recapitulare
Varianta C / C++
Cantitatea de memorie necesara pentru inregistrarea unui tablou este direct
proportionala cu tipul si marimea sa.

tip nume [dimensiune]  sizeof(nume) = sizeof (tip) * dimensiune;

4
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
0. Tablouri unidimensionale – scurta recapitulare
C / C++ Pascal

Traversare ( complexitate O(n) )


for (i = 0; i<n; i++) for i:= 1 to n do
// viziteaza a[i]; { viziteaza a[i];}

Cautare ( liniara – complexitate O(n) )


int t = 0; var t : boolean;
for (i = 0; i<n; i++) t := false;
if (a[i]==x) t = 1; for i:= 1 to n do
if (t==0) // cautare fara succes if (a[i] = x) then t := true;
if (t = false) then
{cautare fara succes};

5
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
0. Tablouri unidimensionale – scurta recapitulare
C / C++ Pascal

Inserare (valoare val pe pozitia poz)

for (i = n-1; i >= poz; i--) for i:= n downto poz do


a[i+1] = a[i]; a[i+1] := a[i];
a[poz] = val; a[poz]:=val;
n++; n := n+1;

Stergere (valoare de pe pozitia poz)

for (i = poz; i<n-1; i++) for i := poz to n-1 do


a[i] = a[i+1]; a[i] := a[i+1];
n--; n:=n-1;

6
Facultatea de Matematica si Informatica
Universitatea din Bucuresti

1. Tablouri bidimensionale – notiuni teoretice


Reprezentarea matricelor in memorie = tablouri de tablouri
int a[3][5] 0 1 2 3 4

0 1 5 -2 8 3
1 5 -6 -8 7 0
2
1 3 1 -4 2

1 5 -2 8 3 5 -6 -8 7 0 1 3 1 -4 2
a[0][0] ………. a[0][4] a[1][0] ………………………………………………… a[2][4]

1 5 -2 8 3 5 -6 -8 7 0 1 3 1 -4 2

a[0] a[1] a[2]

7
Facultatea de Matematica si Informatica
Universitatea din Bucuresti

1. Tablouri bidimensionale – notiuni teoretice


Reprezentarea matricelor in memorie = tablouri de tablouri

Generalizare: a matrice cu m linii si n coloane

a[i][0] ……...... a[i][n-1]

… …

a[0] a[i] a[m-1]

Numele unui tablou este un pointer constant catre primul sau element

int v[100]; v identic cu &v[0];


float a[4][6]; a identic cu &a[0][0];

8
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
1. Tablouri bidimensionale – notiuni teoretice
Varianta C / C++
Cantitatea de memorie necesara pentru inregistrarea unui tablou este
direct proportionala cu tipul si marimea sa.

tip nume [dimensiune1][dimensiune2] 


sizeof(nume) = sizeof (tip) * dimensiune1 * dimensiune2;

9
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
1. Tablouri bidimensionale – notiuni teoretice

Citirea unei matrice Interschimbarea liniei x cu linia y

Afisarea unei matrice Stergerea liniei x dintr-o matrice

10
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.1 – Puncte “șa”

Se citeste o matrice cu n linii si m coloane, cu elemente distincte. Sa se afiseze


punctele “șa” din matrice. Un punct “șa” este acel element care este minim pe
linia sa si maxim pe coloana.

Exemplu
int a[3][5]

0 1 2 3 4

0 10 5 -2 8 33
1 4 -8 -6 7 0
2
3 13 2 4 9

Punct “șa”: a[2][2]

11
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.1 – Puncte “șa” Matrice cu elemente distincte

Sugestie de implementare:

1.consideram un subprogram care sa returneze pozitia pe care se afla


elementul minim de pe o linie;

2.consideram un subprogram care sa returneze pozitia pe care se afla


elementul maxim de pe o coloana;

3.Parcurgem matricea linie cu linie; pe fiecare linie cautam pozitia minimului.


Daca aceasta coincide cu pozitia maximului de pe coloana minimului, atunci
afisam elementul sa.

12
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.1 – Puncte “șa” Matrice cu elemente distincte

Pozitia elementului minim pe o linie Pozitia elementului maxim pe o coloana

Afisarea elementului “sa”

13
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.1 – Puncte “șa”
Cum ati rezolva problema in cazul unei matrice cu n linii si m coloane cu
elemente nedistincte?

Exemplu

int a[3][5]

0 1 2 3 4

0 1 4 1 5 2
1 3 5 3 7 3
2
2 3 0 1 2

Puncte “șa”: a[1][0], a[1][2], a[1][4]

14
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.1 – Puncte “șa” Matrice cu elemente nedistincte

Sugestie de implementare:

1.consideram un subprogram care returneaza elementul minim de pe o linie;


2.Consideram vectorul min_lin[] care sa contina valorile minime de pe fiecare linie a
matricei
3.consideram un subprogram care returneaza elementul maxim de pe o coloana;
4.Consideram un vector max_col[] care sa contina valorile maxime de pe fiecare
coloana a matricei;
5.Parcurgem matricea element cu element; daca a[i][j] coincide cu valoarea de pe
pozitia i din vectorul min_lin[] si cu valoarea de pe pozitia j din vectorul max_col[],
atunci afisam elementul sa. min_lin:
1 4 1 5 2 1
3 5 3 7 3 3
2 3 0 1 2 0
max_col: 3 5 3 7 3
15
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.1 – Puncte “șa” Matrice cu elemente nedistincte

Elementul minim pe o linie Elementul maxim pe o coloana

Afisarea elementului “sa”

16
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.2 – Ordonare diagonala
Se citeste o matrice patratica de dimensiune n x n. Să se sorteze crescator valorile
aflate pe diagonala principală, astfel incat, pe fiecare linie si pe fiecare coloana sa
ramana aceleasi valori (liniile pot fi insa intr-o alta intr-o alta ordine in noua matrice,
la fel si coloanele); altfel spus, sa se sorteze crescator valorile de pe diagonala
principala prin interschimbari de linii si de coloane.

Exemplu int a[4][4]


0 1 2 3 0 1 2 3
0 9 1 7 8 0 1 8 2 5

1 2 6 4 3 1 4 4 6 7

2 5 2 1 8 2 4 3 6 2

3 7 6 4 4 3 7 8 1 9

17
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.2 – Ordonare diagonala
Se citeste o matrice patratica de dimensiune n x n. Să se sorteze crescator valorile
aflate pe diagonala principală, astfel incat, pe fiecare linie si pe fiecare coloana sa
ramana aceleasi valori (liniile pot fi insa intr-o alta intr-o alta ordine in noua matrice,
la fel si coloanele); altfel spus, sa se sorteze crescator valorile de pe diagonala
prinicipala prin interschimbari de linii si de coloane

Sugestie de implementare:

1.consideram un subprogram care sa interschimbe doua linii;


2.consideram un subprogram care sa interschimbe doua coloane;
3.ordonam crescator elemntele de pe diagonala principala utilizand algoritmul de
selectie a minimului (La fiecare iteratie i se interschimba linia i cu linia
corespunzatoare minimului, respectiv coloana i cu coloana minimului).

18
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.2 – Ordonare diagonala

Interschimbarea liniei x cu linia y Interschimbarea coloanei x cu coloana y

19
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.2 – Ordonare diagonala

Ordonarea diagonalei principale folosind algoritmul de


sortare prin selectia minimului

20
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.3 – Diagonalele si paralelele acestora

Se citeste o matrice patratica de dimensiune n x n. Să se afiseze elementele de pe


diagonalele matricei si de pe liniile paralele acestora.

Exemplu Diagonale principale Diagonale secundare

int a[4][4] 8 9
0 1 2 3 7 3 1 2
0 9 1 7 8
1 4 8 7 6 5
1 2 6 4 3
9 6 1 4 8 4 2 7
2 5 2 1 8
2 2 4 3 1 6
3 7 6 4 4
5 6 8 4

7 4

21
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.3 – Diagonalele si paralelele acestora

Sugestie de implementare:

1.Se considera k numarul paralelei cu diagonala principala, respectiv secundara;


prima paralela la diagonala principala considera ultimul element de pe prima linie
(dreapta sus), iar prima paralela la diagonala secundara considera primul
element de pe prima linie (stanga sus);
2.Varianta O(n3): pentru fiecare k se parcurge matricea element cu element si se
verifica conditia de paralela la diagonala principala;
3.Varianta O(n3): pentru fiecare k se parcurge matricea element cu element si se
verifica conditia de paralela la diagonala secundara;
4.Varianta O(n2): pentru fiecare k se considera elementele de pe linia i si
paralela k la diagonala principala (indicele de coloana este inlocuit cu formula
corespunzatoare);
5.Varianta O(n2): pentru fiecare k se considera elementele de pe linia i si
paralela k la diagonala secundara (indicele de coloana este inlocuit cu
formula corespunzatoare).

22
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.3 – Diagonalele si paralelele acestora O(n3)

Paralele la diagonala principala Paralele la diagonala secundara

23
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.3 – Diagonalele si paralelele acestora O(n2)
Paralele la diagonala principala Paralele la diagonala secundara

24
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine

https://www.pbinfo.ro/?pagina=probleme&id=602
25
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine

https://www.pbinfo.ro/?pagina=probleme&id=602

26
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Sugestie de implementare:
1. construim matricea a cu semnificatia
a[x][y] = 0, daca pe pozitia (x,y) nu este plasata o regina
a[x][y] = numarul reginei aflata pe linia x si coloana y, altfel

1
2 3

4
5 6 7

8 9

matricea a
celulele libere memoreaza 0
27
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Sugestie de implementare:
1. construim matricea a cu semnificatia
a[x][y] = 0, daca pe pozitia (x,y) nu este plasata o regina
a[x][y] = numarul reginei aflata pe linia x si coloana y;
2. construim vectorul atac cu semnificatia
atac[i]=cate regine sunt atacate de regina i (initial 0);
3. pentru fiecare regina stabilim ce regine de pe aceeasi line ataca, parcurgand
matricea linie cu linie;
1
De exemplu, când parcurgem linia 5,
2 3 găsim următoarele perechi de numere pozitive
consecutive (care au doar 0 intre ele):
4 (5,6)  crește atac[5] si atac[6]
5 6 7
(6,7)  crește atac[6] si atac[7]

8 9
28
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Sugestie de implementare:
1. construim matricea a cu semnificatia
a[x][y] = 0, daca pe pozitia (x,y) nu este plasata o regina
a[x][y] = numarul reginei aflata pe linia x si coloana y;
2. construim vectorul atac cu semnificatia
atac[i]=cate regine sunt atacate de regina i (initial 0);
3. pentru fiecare regina stabilim ce regine de pe aceeasi line ataca, parcurgand
matricea linie cu linie;
4. pentru fiecare regina stabilim ce regine de pe aceeasi coloana ataca,
parcurgand matricea coloana cu coloana;
5. pentru fiecare regina stabilim ce regine de pe aceeasi diagonala paralela cu
cea principala ataca, parcurgand matricea paralel cu diagonala principala;
6. pentru fiecare regina stabilim ce regine de pe aceeasi diagonala paralela cu
cea secundara ataca, parcurgand matricea paralel cu diagonala secundara
7. Parcurgem vectorul atac[] pentru gasirea elementului maxim si a frecventei
acestuia.
29
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Actualizarea vectorului (int atac[501], int a[101][101], int n)
“atac” prin considerarea
conflictelor de pe aceeasi 1
linie 2 3

Regina atac
4
1 0 5 6 7

2 1
8 9
3 1
4 0
5 1
6 2
7 1
8 1
9 1 30
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Actualizarea vectorului (int atac[501],int
“atac” prin considerarea a[101][101],int n)
conflictelor de pe aceeasi 1
coloana 2 3

Regina Atac
4
1 1 5 6 7

2 2
8 9
3 2
4 0
5 3
6 2
7 2
8 2
9 2 31
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Actualizarea vectorului (int atac[501], int a[101][101],
“atac” prin considerarea int n)
conflictelor de pe
1
diagonalele paralele cu
2 3
diagonala principala

Regina Atac 4
5 6 7
1 2
2 3 8 9

3 3
4 1
5 4
6 4
7 2
8 2 32
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Actualizarea vectorului “atac” prin
considerarea conflictelor de pe
diagonalele paralele cu diagonala
1
principala
2 3
Regina Atac
1 2 4
5 6 7
2 3
3 3 8 9

4 1
5 4
6 4
7 2
8 2
9 3
33
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Actualizarea vectorului
(int atac[501], int a[101][101],
“atac” prin considerarea
int n)
conflictelor de pe
1
diagonalele paralele cu
2 3
diagonala secundara

Regina Atac 4
5 6 7
1 2
2 3 8 9

3 4
4 1
5 4
6 5
7 2
8 2 34
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)
Actualizarea vectorului “atac” prin
considerarea conflictelor de pe
diagonalele paralele cu diagonala 1
secundara 2 3
Regina Atac
4
1 2
5 6 7
2 3
3 4 8 9

4 1
5 4
6 5
7 2
8 2
9 3 35
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 1. numarul de regine este mult mai mare decat n – Complexitate O(n2)

Constructia matricei initiale Gasirea reginei cu cele mai multe atacuri

Actualizarea vectorului “atac”

36
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 2. numarul de regine este mult mai mic decat n – Complexitate O(m2)
Sugestie de implementare:
1. consideram un vector de structuri “r”, unde fiecare componenta retine coordonatele
unei regine pe tabla de sah;
2. sortam vectorul in ordinea crescatoare a absciselor pozitiilor reginelor; la abscise
egale, sortam dupa ordonata;
3. construim vectorul atac cu semnificatia
atac[i]=cate regine sunt atacate de regina i;
4. pentru fiecare regina “i” cautam prima regina aflata in dreapta sa, pe aceeasi linie
= prima regina care ii urmeaza in vectorul r care se afla pe aceeasi linie ;
5. pentru fiecare regina “i” cautam prima regina aflata sub ea, pe aceeasi coloana;
= prima regina care ii urmeaza in vectorul r care se afla pe aceeasi coloana ;
6. pentru fiecare regina “i” cautam prima regina aflata pe aceeasi diag. principala;
7. pentru fiecare regina “i” cautam prima regina aflata pe aceeasi diag. secundara;
8. Parcurgem vectorul atac[] pentru gasirea elementului maxim si a frecventei
acestuia.

37
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 2. numarul de regine este mult mai mic decat n – Complexitate O(m2)

Exemplificare modificare vector atac dupa iteratia pentru Regina 1

R[i].x R[i].y Atac_lin Atac_col Atac_dp Atac_ds Total Total


anterior Actual
1 7 1 1 0 2
2 2 0 0
2 8 0 1
4 1 0 0
5 2 0 0
5 5 0 0
5 8 0 0
7 2 0 0
7 7 0 1
38
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 2. numarul de regine este mult mai mic decat n – Complexitate O(m2)

Exemplificare modificare vector atac dupa iteratia pentru Regina 2

R[i].x R[i].y Atac_lin Atac_col Atac_dp Atac_ds Total Total


anterior Actual
1 7 2 2
2 2 1 1 1 0 3
2 8 1 2
4 1 0 0
5 2 0 1
5 5 0 1
5 8 0 0
7 2 0 0
7 7 1 1
39
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 2. numarul de regine este mult mai mic decat n – Complexitate O(m2)

Actualizarea vectorului
“atac” prin considerarea
primului conflict aparut
pe aceeasi linie

40
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 2. numarul de regine este mult mai mic decat n – Complexitate O(m2)

Actualizarea vectorului
“atac” prin
considerarea primului
conflict aparut pe
aceeasi coloana,
respectiv pe aceeasi
diagonala principala si
secundara

41
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.4 – Atac regine
Caz 2. numarul de regine este mult mai mic decat n – Complexitate O(m2)

Constructia vectorului de pozitii Gasirea reginei cu cele mai multe atacuri

Sortarea vectorului de pozitii

42
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice

Se consideră o matrice în care fiecare linie și fiecare coloană este sortată


strict crescător.
Să se determine dacă o valoare dată se găsește în matrice sau nu.

Exemplu

int a[3][5]
1 2 3 4 5
4 6 8 10 12
5 7 12 24 29

Valoarea 10 se afla in matrice.


Valoarea 9 nu se afla in matrice

43
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(nm)
- rezolvare1 – Cautarea standard a unui element intr-o matrice
- se parcurge matricea element cu element si verifica existenta valorii
cautate in matrice;

45
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n log m)

rezolvare2 - Cautarea unui element intr-o matrice folosind, pe fiecare linie,


cautarea binara, intrucat fiecare linie e ordonata crescator.

46
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n log m)

rezolvare3 - Cautarea unui element intr-o matrice folosind, pe fiecare linie, cautarea
binara, intrucat fiecare linie e ordonata crescator. Optimizare: ignorarea acelor linii
care sigur nu contin elementul x (cele care incep cu elemente > x si cele care se
termina cu elemente < x).

De exemplu, valoarea 10 se poate afla doar


1 2 3 4 5
pe liniile 2 si 3, nu are sens sa o cautam pe:
4 6 8 10 12 -linia 1 – deoarece are pe ultima coloana valoarea 5,
5 7 12 24 29 deci cea mai mare valoare de pe linia 1 este 5,
-linia 4 – deoarece are pe prima linie valoarea 11,
11 13 15 28 30 deci cea mai mica valoare de pe linie este 11,
40 41 43 45 51 -linia 5 – cea mai mica valoare de pe linie este 40

47
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n log m)

rezolvare3 - Cautarea unui element intr-o matrice folosind, pe fiecare linie, cautarea
binara, intrucat fiecare linie e ordonata crescator. Optimizare: ignorarea acelor linii
care sigur nu contin elementul x (cele care incep cu elemente > x si cele care se
termina cu elemente < x).

48
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n + m)
rezolvare4 – restrictionam mai mult decat in rezolvarea3 zona in care cautam
valoarea x, pe baza urmatoarelor observatii:

1. Daca un element de pe pozitia (i,j) este mai mare (strict) decat x, atunci toate
elementele aflate pe pozitii (r,s) cu r ≥ i si s ≥ j sunt mai mari decat x:

a[i][j]>x
Toate elementele din aceasta zona vor fi
mai mari decat x 
x nu mai trebuie cautat in aceasta zona

49
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n + m)
rezolvare4 – restrictionam mai mult decat in rezolvarea3 zona in care cautam
valoarea x, pe baza urmatoarelor observatii:

2. Daca un element de pe pozitia (i,j) este mai mic (strict) decat x, atunci toate
elementele aflate pe pozitii (r,s) cu r ≤ i si s ≤ j sunt mai mici decat x:

Toate elementele din aceasta zona vor fi


mai mici decat x 
x nu mai trebuie cautat in aceasta zona
a[i][j]<x

50
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n + m)
rezolvare4 – restrictionam mai mult decat in rezolvarea3 zona in care cautam
valoarea x, pe baza urmatoarelor observatii:
3. Din observatiile anterioare rezulta ca putem parcurge matricea:
- pe o linie de la dreapta la stanga pana intalnim un element a[i][j]≤ x ;
daca elementul este chiar x, atunci ne oprim;
altfel, din primele observatii, nu mai trebuie sa cautam pe coloanele > j (nici pe
liniile ≤ i); astfel, putem cobori pe coloana j pe care am ajuns

Cautam x=21
7 8 10 23 24 presupunem liniile si coloanele numeroate de la 1
-Parcurgem prima linie de la dreapta la stanga
12 16 18 25 26
pana la primul element < 21, adica pana la a[1][3]=10
13 17 19 27 29
-In regiunea gri nu mai trebuie sa cautam,
20 21 22 30 31 sigur sunt elemente > 21
28 37 40 41 45
 Coboram pe coloana 3

51
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n + m)
rezolvare4 – restrictionam mai mult decat in rezolvarea3 zona in care cautam
valoarea x, pe baza urmatoarelor observatii:
3. Din observatiile anterioare rezulta ca putem parcurge matricea:
- pe o linie de la dreapta la stanga pana intalnim un element a[i][j]≤ x ;
daca elementul este chiar x, atunci ne oprim;
altfel, din primele observatii, nu mai trebuie sa cautam pe coloanele > j (nici pe
liniile ≤ i); astfel, putem cobori pe coloana j pe care am ajuns
- coboram pe coloana curenta j pana cand intalnim un element a[i][j] ≥ x ;
daca elementul este chiar x, atunci ne oprim;
altfel, din primele observatii, nu mai trebuie sa cautam pe linii < i (nici pe
coloanele ≥ j); Cautam x=21
7 8 10 23 24 Coboram pe coloana 3 pana la a[4][3]=22>21
12 16 18 25 26
- In regiunea mov nu mai trebuie sa cautam,
13 17 19 27 29 sigur sunt elemente < 21 (nici in cea gri,
conform pasului anterior)
20 21 22 30 31
 mergem la stanga pe linia 3
28 37 40 41 45 52
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n + m)
rezolvare4 – restrictionam mai mult decat in rezolvarea3 zona in care cautam
valoarea x, pe baza urmatoarelor observatii:
3. Din observatiile anterioare rezulta ca putem parcurge matricea:
- pe o linie de la dreapta la stanga pana intalnim un element a[i][j]≤ x ;
daca elementul este chiar x, atunci ne oprim;
altfel, din primele observatii, nu mai trebuie sa cautam pe coloanele > j (nici pe
liniile ≤ i); astfel, putem cobori pe coloana j pe care am ajuns
- coboram pe coloana curenta j pana cand intalnim un element a[i][j] ≥ x ;
daca elementul este chiar x, atunci ne oprim;
altfel, din primele observatii, nu mai trebuie sa cautam pe linii < i (nici pe
coloanele ≥ j); este suficient sa mergem, din nou, pe linia curenta la stanga
si reluam etapele
7 8 10 23 24
12 16 18 25 26 Am gasit 21 !  STOP
13 17 19 27 29
20 21 22 30 31
28 37 40 41 45 53
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n + m)
rezolvare4 – restrictionam mai mult decat in rezolvarea3 zona in care cautam
valoarea x, pe baza urmatoarelor observatii:

Astfel, trebuie doar sa parcurgem matricea dupa regulile descrise


alternativ pe linii de la dreapta la stanga si in jos pe coloane pana
gasim x sau iesim din matrice sau ajungem la o linie/coloana
restrictionata cu criteriul de la rezolvarea3

Spre exemplu, dacă valoarea căutată ar fi fost 15, traseul este urmatorul,
si se ajunge la o linie restrictionata (care incepe cu un element>15)
7 8 10 23 24
12 16 18 25 26
13 17 19 27 29
20 21 22 30 31
28 37 40 41 45
54
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.5 – Exista valoare in matrice O(n + m)
rezolvare4 – Parcurgerea alternativa a liniilor si coloanelor pana cand se gaseste
numarul sau se atinge limita unei linii sau a unei coloane.

55
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista)
Se consideră o matrice în care fiecare linie este sortată crescător. Să se
determine un element comun tuturor liniilor (dacă există).

Exemplu

int a[4][5]
1 7 12 15 20
3 4 7 11 16
2 3 4 7 15
7 8 9 10 11

Valoarea 7 este comuna.

56
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista)

Sugestie de implementare:
1. rezolvare() – foloseste algoritmul de cautare secventiala pentru gasirea unei valori
pe o linie; aplica algoritmul pentru a cauta fiecare element de pe prima linie in fiecare
linie din matrice;
2. rezolvare_binar() – optimizeaza subprogramul rezolvare() cautand binar o valoare
intr-un vector;
3.– optimizeaza primele doua subprograme restrictionand limitele intervalelor de
cautare (determinam pentru fiecare linie intre ce coloane este suficient sa cautam);
4. rezolvare3() – O(mn) :
4.1 – se considera un vector col_crt[i] = retine ultima coloana de pe linia i pana la
care trebuie cautat elementul comun;
4.2 - determinam valoarea minima din col_crt - este o limita superioara pentru
elementul comun;
4.3 – scadem pt fiecare linie i col_crt[i] pana ajunge pe un element
<=a[lin_min][col_crt[lin_min]] (mai la dreapta nu are sens sa cautam pe linie);
4.4 – definim cnt = cate limite de coloane sunt egale cu valoarea minima
a[lin_min][col_crt[lin_min]];
4.5 – daca pentru fiecare linie elementul de pe coloana col_crt[i] este
=a[lin_min][col_crt[lin_min]] atunci liniile au un element comun.
57
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nm2)

Cautarea secventiala Algoritmul complet de rezolvare

58
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nmlog m)

Cautarea binara
Algoritmul complet de rezolvare

59
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nm2)
Cu stabilirea limitelor de interval.

Cautarea secventiala Maxim pe coloane Minim pe coloane

1 7 12 15 20 Minimul ultimei
Maximul primei
coloane coloane
3 4 7 11 16
2 3 4 7 15
7 8 9 10 11
60
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nm2)
Algoritmul complet de rezolvare Cu stabilirea limitelor de interval.

61
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nmlog m)
Algoritmul complet de rezolvare Cu stabilirea limitelor de interval.

62
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nm)
Algoritmul complet de rezolvare
Sugestie de implementare:

4. rezolvare3() – O(nm) :
4.1 – se considera un vector col_crt[i] = retine ultima coloana de pe linia i pana la
care trebuie cautat elementul comun;
4.2 - determinam valoarea minima din col_crt - este o limita superioara pentru
elementul comun;
4.3 – scadem pt fiecare linie i col_crt[i] pana ajunge pe un element
<=a[lin_min][col_crt[lin_min] (mai la dreapta nu are sens sa cautam pe linie);
4.4 – definim cnt = cate limite de coloane sunt egale cu valoarea minima
a[lin_min][col_crt[lin_min]];
4.5 – daca cnt = numarul de linii din matrice, atunci am gasit valoarea comuna
4.6 – daca pentru fiecare linie elementul de pe coloana col_crt[i] este
=a[lin_min][col_crt[lin_min]] atunci liniile au un element comun.
4.7 – se repeta procedeul pana la iesirea din matrice sau pana la gasirea valorii
comune

63
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nm)
Algoritmul complet de rezolvare

Gasirea liniei care


contine elementul
minim de pe ultima
coloana (elementul
de la care se
porneste cautarea).

1 7 12 15 20 Gasirea valorilor 1 7 12 15 20
3 4 7 11 16 maxime initiale pana
3 4 7 11 16
la care trebuie
2 3 4 7 15 realizata cautarea pe 2 3 4 7 15
7 8 9 10 11 fiecare linie 7 8 9 10 11

64
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nm)
Algoritmul complet de rezolvare

Pentru val = 11 Cnt = 2. Se


repeta algoritmul pe noile
valori ale vectorului col_crt[]

1 7
3 4 7 11
2 3 4 7
7 8 9 10 11

1 7
3 4 7
2 3 4 7
7

65
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
2. Tablouri bidimensionale – Aplicatii
Aplicatie 2.6 – Element comun tuturor liniilor (daca exista) O(nm)
Algoritmul complet de rezolvare

Pentru val = 7 Cnt = 4 – Numarul de aparitii ale valorii = numarul de linii din
matrice (cautare cu succes) .

1 7
3 4 7
2 3 4 7
7

66
Facultatea de Matematica si Informatica
Universitatea din Bucuresti

Operatii pe tablouri bidimensionale


Concluzii

S-au recapitulat notiunile urmatoare:


• Tablouri unidimensionale;
• Tablouri bidimensionale – notiuni teoretice;
• Tablouri bidimensionale - Aplicatii.

Succes!

67