Sunteți pe pagina 1din 57

Algoritmi i programare 1/57

Algoritmi i programare
2009 2010
Marian Balt
Cristian Gau

www.infoiasi.ro/~ap
Algoritmi i programare 2/57
Obiective
Algoritmi
nsuirea unei gndiri algoritmice
dezvoltarea abilitilor de proiectare de soluii
algoritmice
nsuirea tehnicilor de utilizare a principalelor
structuri de date
evaluarea timpului de execuie n cazul cel mai
nefavorabil
Programare
iniiere n utilizarea unui limbaj de programare
implementarea principalelor structuri de date
nsuirea tehnicilor de baz n proiectarea
programelor
Algoritmi i programare 3/57
Coninutul disciplinei
Algoritmi
limbaj algoritmic, tablouri, structuri statice,
structuri nlnuite
liste liniare
arbori binari, heap-uri, union-find
grafuri (ca structuri de date)
sortare, cutare
Programare
prezentarea graduat a limbajului C (ISO
Standard) cu accent pe implementarea
structurilor de date i a soluiilor prezentate n
prima parte
Algoritmi i programare 4/57
Evaluare
condiii:
activitatea la seminar (AS)
activitatea la laborator (AL)
testele scrise (TS)
criterii de promovare:
AS >= 5, AL >= 5, TS >= 4
forme:
AS: ntrebri, participare la discuii, soluii
originale (1 + nr. prezente + activitate)
AL: fiecare tem de laborator va fi notat cu note
de la 1 la 10
TS: 2 teste scrise (spt. 8, 16), fiecare test
coninnd probabil 8 ntrebri gril i o problem.
Algoritmi i programare 5/57
Evaluare
normele ECTS (European Credit Transfer System)
Punctaj Final (PF) = 10% AS + 40% AL +50% TS

Nota final:
<= 4 dac sunt ndeplinite condiiile i NU sunt
ndeplinite criteriile de promovare,
= 10 dac PF este n primii 5% din cei promovai (A)
= 9 urmtorii 10% din cei promovai (B)
= 8 urmtorii 20% din cei promovai (C)
= 7 urmtorii 30% din cei promovai (D)
= 6 urmtorii 25% din cei promovai (E)
= 5 ultimii 10% din cei promovai
Algoritmi i programare 6/57
Bibliografie
D. Lucanu, M. Craus: Proiectarea algoritmilor,
Polirom, 2008
T.H. Cormen, C.E. Leiserson, R.L. Rivest:
Introducere in algoritmi, Libris Agora, 2000
E. Horowitz, S. Sahni, S. Anderson - Freed
Fundamentals of Data Structures in C, Computer
Science Press, 1993
L. Livovschi, H. Georgescu: Sinteza si analiza
algoritmilor, Ed. Stiintifica si enciclopedica, 1986

Algoritmi i programare 7/57
Curs 1
limbaj algoritmic
tablouri
structuri
calculul unui program
problema rezolvat de un program
timpul de execuie

Algoritmi i programare 8/57
Algoritmi, limbaj algoritmic
Problem, Soluie
Algoritm: o secven finit de pai aranjat ntr-o
ordine logic specific, cu proprietatea c, atunci
cnd este executat, produce o soluie pentru o
problem dat.
Exemplu: reeta culinar
Algoritm calculator (computer algorithm) = un
algoritm pentru care secvena de pai este
executat de un calculator
Limbaj Algoritmic = un limbaj folosit pentru
descrierea algoritmilor
Muammad ibn Musa al-Khwarizmi
Algoritmi i programare 9/57
al-Khwarizmi
Algoritmi i programare 10/57
Algoritmi - proprieti
intrare (input) zero sau mai multe entiti de
informaie furnizate din exterior

ieire (output) algoritmul produce informaie

terminare pentru orice intrare, algoritmul
execut un numr finit de pai

corectitudine algoritmul se termin i produce
ieirea corect pentru orice intrare. Spunem c
algoritmul rezolv problema dat.
Algoritmi i programare 11/57
Limbaj algoritmic
modelarea memoriei
tipuri de date elementare
instruciuni
tipuri de date structurate de
nivel jos
calcul
timp de execuie
Algoritmi i programare 12/57
Variabil
Nume
Adres
Atribute (tip de date asociat valorilor
memorate)



Instan a variabilei
x
adr
int
Algoritmi i programare 13/57
Structur liniar de celule
Variabile



Pointeri
Memoria
x
adr
int
*p
int
p int*
adr
adr
Algoritmi i programare 14/57
Tip de date
Domeniul tipului (colecia de obiecte)
Operaiile tipului
Categorii de tipuri de date:
Tipuri de date elementare
Tipuri de date structurate de nivel jos
Operaiile la nivel de component
Tipuri de date de nivel nalt
Operaiile implementate de algoritmi utilizator
Algoritmi i programare 15/57
Tipuri de date elementare
Numere ntregi
Valori: numere ntregi
Operaii: +, -, ...
Numere reale
Valori: numere raionale
Operaii: +, -, ...
Valori booleene
valori: true, false
Operaii: and, or, not
Algoritmi i programare 16/57
Tipuri de date elementare
Caractere
Valori: a, b, ...
Operaii: nu exist
Pointeri
Valori: adrese de variabile aparinnd
altui tip, valoarea NULL
Operaii: nu
adr
*p int
p int*
adr
Algoritmi i programare 17/57
Tipuri de date elementare
Pointeri
Referire indirect: *p
Tipul pointer cu domeniul t: t*
integer*
Variabile dinamice
Creare: new(p)
Distrugere: delete(p)


Algoritmi i programare 18/57
Tip de date
Tip de date abstract: tip de date organizat
n aa fel nct specificarea obiectelor i
specificarea operaiilor este independent de
reprezentarea obiectelor i implementarea
operaiilor

model standard = model utilizat pentru
specificarea tipurilor de date abstracte
(bazat pe notaii matematice)
Algoritmi i programare 19/57
Tip de date abstract:
exemple
INT
obiecte: int = {. . . 2, 1, 0, 1, 2, . . . }
operaii:
adunarea
intrare: a, b int
iesire: a + b
. . .
BOOL
obiecte: bool = {false, true}
operaii:
conjuncia
intrare: a, b bool
iesire: a b (a and b)
. . .
Algoritmi i programare 20/57
Instruciuni
Atribuirea
Sintaxa:
<variabil> <expresie>
Sematica:
Se evalueaz <expresie> i rezultatul
obinut se memoreaz n locaia desemnat
de <variabil>
Este singura instruciune cu ajutorul creia
se poate modifica coninutul memoriei
Algoritmi i programare 21/57
Instruciuni
Atribuirea
nainte de atribuire
Dup atribuirea u -v*u
u
40
int
v
20
int
u
-800
int
v
20
int
Algoritmi i programare 22/57
Instruciuni
Atribuirea cazul pointerilor
Sintaxa:
*<variabil pointer> <expresie>
Sematica:
Se evalueaz <expresie> i rezultatul obinut se
memoreaz n locaia de la adresa stocat n <variabil
pointer>
*p 10
*p
10
int
p
adr
int*
adr
Algoritmi i programare 23/57
if
Sintaxa:
if <expresie>
then <secven-instruciuni
1
>
else < secven-instruciuni
2
>

if <expresie>
then <secven-instruciuni
1
>

if <expresie> then <secven-instruciuni
1
>
Instruciuni
Expresie cu rezultat
boolean dup evaluare
Algoritmi i programare 24/57
Instruciuni
Forma n cascad:
if (...)
then ...
else if (...)
then ...
else if (...)
then ...
else ...

se scrie n forma liniar echivalent:
if (...) then
...
else if (...) then
...
else if (...) then
...
else ...
Algoritmi i programare 25/57
Instruciuni
if
Semantica:
Se evalueaz <expresie>. Dac rezultatul
este true, atunci se execut <secven-
instruciuni
1
> iar dac rezultatul este false,
atunci se execut <secven-instruciuni
2
>
dup care instruciunea if se termin
Algoritmi i programare 26/57
Exemple if
Calcululul minimului a dou numere:
if (a < b)
then min a
else min b

sau

min a
if (b < a) then min b
Algoritmi i programare 27/57
Instruciuni
while
Sintaxa:
while <expresie> do
<secven-instruciuni>
Semantica:
1. Se evalueaz <expresie>
2. Dac rezultatul este true atunci se
execut <secven-instruciuni> dup care
se reia procesul ncepnd cu pasul 1. Dac
rezultatul este false atunci execuia
instruciunii while se termin
Expresie cu rezultat
boolean dup evaluare
Algoritmi i programare 28/57
Exemplu while
cel mai mic k astfel nct 7
k
>= n
pentru un n dat

k 0
sapte_la_k 1
while (sapte_la_k < n)
k k+1
sapte_la_k sapte_la_k * 7
Algoritmi i programare 29/57
Instruciuni
repeat
Sintaxa:
repeat
<secven-instruciuni>
until <expresie>
Expresie cu rezultat
boolean dup evaluare
Algoritmi i programare 30/57
Instruciuni
repeat
Semantica:
Instruciunea:
repeat
S
until e
simuleaz execuia urmtorului program
S
while (not e) do
S
Algoritmi i programare 31/57
Exemplu repeat
cel mai mic k astfel nct 7
k
>= n
pentru un n dat:
k 0
sapte_la_k 1
repeat
k k+1
sapte_la_k sapte_la_k * 7
until (sapte_la_k >= n)
Algoritmi i programare 32/57
Instruciuni
for
Sintaxa:
for <variabil> <expresie
1
> to <expresie
2
> do
<secven-instruciuni>

sau

for <variabil> <expresie
1
> downto <expresie
2
>do
<secven-instruciuni>
Variabil de
tip ntreg
Expresii cu rezultat ntreg
dup evaluare
Algoritmi i programare 33/57
Instruciuni
for
Semantica:
for i e1 to e2 do
S
este echivalent cu:
i e1
temp e2
while(i temp) do
S
i i + 1
Algoritmi i programare 34/57
Instruciuni
for
Semantica:
for i e1 downto e2 do
S
este echivalent cu:
i e1
temp e2
while(i temp) do
S
i i - 1
Algoritmi i programare 35/57
Instruciuni
throw (excepii)
Sintaxa:
throw <mesaj>
Semantica:
Execuia programului se oprete i este afiat textul
<mesaj>
Se folosete de obicei cu if:
if <expresie>
then throw <mesaj>
Exemplu:
new(p)
if (p = NULL)
then throw memorie insuficienta
ir de caractere
(text)
Algoritmi i programare 36/57
Subprograme
Limbajul este modular: un program
conine un numr de module
Un modul n limbajul prezentat este
identificat cu un subprogram
Subprograme:
Proceduri
Funcii

Algoritmi i programare 37/57
Subprograme
Proceduri:
Sintaxa:
procedure <nume>(<lista-parametri-formali>)
begin
<secven-instruciuni>
end
Apel:
<nume>(<lista-parametri-actuali>)
Interfaa ntre o procedur i modulul care o apeleaz
se realizeaz doar prin intermediul parametrilor i a
variabilelor globale

Opional
variabile
Expresii de
acelai tip
Algoritmi i programare 38/57
Subprograme
Proceduri:
procedure swap(x, y)
begin
aux x
x y
y aux
end

swap(a, b)
swap(b, c)
Algoritmi i programare 39/57
Subprograme
Funcii:
Sintaxa:
function <nume>(<lista-parametri-formali>)
begin
<secven-instruciuni>
end
Apel:
<nume>(<lista-parametri-actuali>)
utilizat ntr-o expresie: valoarea ntoars de
funcie este cea obinut prin evaluarea
<expr>
Opional
variabile
Conine mcar o
instruciune
return <expr>
Algoritmi i programare 40/57
Subprograme
Funcii:
function max3(x, y, z)
begin
temp x
if(y > temp) then temp y
if(z > temp) then temp z
return temp
end

2*max3(a, b, c) max3(a, b, c) > 5
Algoritmi i programare 41/57
Comentarii
Sintaxa:
/* */

function alpha(x)
begin
if(x > 0) /* testeaza x pozitiv */
then x x-1 /* decrementeaza x */
else x x+1 /* incrementeaza x */
return x
end
Algoritmi i programare 42/57
Tablouri
Ansamblu omogen de variabile numite
componentele tabloului
Toate componentele aparin aceluiai tip
Componentele sunt identificate cu
ajutorul indicilor
Tablouri:
Unidimensionale (1 dimensionale)
Bidimensionale (2 - dimensionale)
Algoritmi i programare 43/57
Tablouri unidimensionale







int[5
]
a
a[0]
a[1]

a[2]

a[3]

a[4]

int
int

int

int

int

Algoritmi i programare 44/57
Tablouri unidimensionale
Memoria este o secven contigu de
locaii
Ordinea de memorare ordinea indicilor
Operaiile se realizeaz prin intermediul
componentelor
for i 0 to n 1 do
a[i] 0

for i 0 to n 1 do
c[i] a[i] + b[i]
Algoritmi i programare 45/57
Tablouri bidimensionale
Memorie contigu de mn locaii
Componentele sunt identificate cu ajutorul
a 2 indici:
Primul indice are valori {0, 1, , m -1}
Al doilea indice are valori {0, 1, , n -1}
Variabilele componente : a[0, 0], a[0, 1], ,
a[0, n-1], a[1, 0], a[1, 1], , a[1, n-1], , a[m-
1, 0], a[m-1, 1], , a[m-1, n-1]
Ordinea de memorare a componentelor
este dat de ordinea lexicografic a indicilor
Algoritmi i programare 46/57
Tablouri bidimensionale
int[3,3]
a
a[0,0]
a[0,1]

a[0,2]

a[1,0]

a[1,1]

int
int

int

int

int

a[1,2]

int

Algoritmi i programare 47/57
Tablouri bidimensionale
Cu analogia de la matrici, un tablou 2-
dimensional poate fi privit ca un
tablou 1-dimensional n care fiecare
component este un tablou 1-
dimensional.
Notaie:
a[0][0], a[0][1], , a[0][n-1],,
a[m-1][0], a[m-1][1],, a[m-1][n-1]
Algoritmi i programare 48/57
Tablouri bidimensionale
Un tablou 1-dimensional cu componente
tablouri 1-dimensionale poate fi schiat
astfel:

tab2d a
a[0]
a[1]

tab1d
tab1d
Algoritmi i programare 49/57
Tablouri bidimensionale
Operaiile cu tablori 2-dimensionale
se realizeaz prin intermediul
componentelor:

for i 0 to m 1 do
for j 0 to n 1 do
c[i,j] 0
for k 0 to p 1 do
c[i,j] c[i,j]+a[i,k]*b[k,j]
Algoritmi i programare 50/57
iruri de caractere
Pot fi considerate ca fiind tablouri
unidimensionale cu elemente de tip
caracter.
Constantele ir de caracter se
noteaz utiliznd : ir-de-
caractere
Operaii:
Concatenarea, notat cu +:
un sir + alt sir = un siralt sir
Algoritmi i programare 51/57
Structuri statice
Structur: ansamblu eterogen de variabile
numite cmpuri; structura are un nume i
fiecare cmp are propriul nume i propriul tip.
Numele complet al unui cmp:
persoana.varsta, persoana.prenume,
persoana.adresa.strada, punct.x,
punct.y
dac p este pointer la persoana:
p->varsta, pp->x
Memoria alocat este o zon contigu;
elementele sunt memorate n ordinea
declarrii n structur
Algoritmi i programare 52/57
Structuri (articole)
d data
d.z zi
d.ln luna
d.a
an
Algoritmi i programare 53/57
Structuri si pointeri
*d
data
dz zi
dln
luna
da
an
d
data*
Algoritmi i programare 54/57
Calculul unui program
Configuraie:
Instruciunea curent(starea programului)
Starea memoriei (valorile curente ale
variabilelor din program)
Relaia de tranziie c
i-1
c
i
Starea memoriei din c
i
este obinut prin
execuia instruciunii din c
i-1

Instruciunea din c
i
este urmtoarea ce trebuie
executat

Configuraie iniial, configuraie final
Pot exista calcule infinite
Algoritmi i programare 55/57
Calculul unui program
x 0
i 1
while(i < 4) do
x x*10+i
i i+2

Fiecare instructiune se
execut ntr-o
unitate de timp
T = 9

Pasul Instruciunea i x
0
x 0
- -
1
i 1
- 0
2
i < 4
1 0
3
x x*10+i
1 0
4
i i + 2
1 1
5
i <4
3 1
6
x x*10+i
3 1
7
i i + 2
3 13
8
i <4
5 13
Algoritmi i programare 56/57
Timpul de execuie n cazul cel mai
nefavorabil
i 0
while (i < n-1 and a[i] != x) do
i i + 1
if (a[i] = x)
then poz i
else poz -1

Fie a = (4,3,6,2,8,5).
Cazul cel mai favorabil x = 4. Atunci T = 4
Cazul cel mai nefavorabil: x = 5 sau nu este n
vector. Atunci T = 1 + 2 * 5 + 2
n general: T(n) = 1 + 2*(n-1) + 2 =2*n+1
Algoritmi i programare 57/57
Notaia O(f(n))
funcii f(n) de argument numr natural i valori
numere reale pozitive
O(f(n)) = clasa funciilor mrginite superior
asimptotic de funcia f(n)
g(n)O(f(n)) dac exist c>0, n
0
natural,
astfel nct g(n)c*f(n) pentru orice nn
0
funciile constante O(1)
polinoamele de grad 1 O(n)
polinoamele de grad 2 O(n
2
)
funcii logaritmice O(log n)
Notaie: T(n) = O(n) n loc de T(n) O(n)

S-ar putea să vă placă și