Sunteți pe pagina 1din 57

Algoritmi şi programare

2008 – 2009
Curs 1

Cristian Gaţu, Marian Baltă


www.infoiasi.ro/~mbalta/ro/ap

Algoritmi si programare 2008 1


Obiective
• Algoritmi:
– însuşirea unei gândiri algoritmice
– dezvoltarea abilităţilor de proiectare de soluţii
algoritmice
– însuşirea tehnicilor de utilizare a principalelor
structuri de date
– evaluarea timpului de execuţie în cazul cel mai
nefavorabil
• Programare
– iniţiere în utilizarea unui limbaj de programare
– descrierea principalelor structuri de date
– însuşirea tehnicilor de bază în proiectarea
programelor
Algoritmi si programare 2008 2
Conţinutul disciplinei
• Algoritmi
– limbaj algoritmic, tablouri, structuri statice,
structuri înlănţuite
– liste liniare
– arbori binari, heap-uri, union-find
– grafuri (ca structuri de date)
– sortare, căutare
• Programare
– prezentarea graduată a limbajului C (ISO
Standard) cu accent pe implementarea
structurilor de date şi a soluţiilor prezentate în
prima parte
Algoritmi si programare 2008 3
Evaluare
• condiţii:
– activitatea la seminar (AS)
– activitatea la laborator (AL)
– testele scrise (TS)
• criterii de promovare:
– AS >= 5, AL >= 6, TS >= 4
• forme:
– AS: întrebări, participare la discuţii, soluţii
originale
– AL: fiecare temă de laborator va fi notată cu
note de la 1 la 10
– TS: 2 teste scrise (săpt. 7, 13), fiecare test
conţinând 8 întrebări grilă şi o problemă.
Algoritmi si programare 2008 4
Evaluare
• normele ECTS (European Credit Transfer System)
• Punctaj Final (PF) = 10% AS + 40% AL +50% TS

• Nota finală:
– <= 4 dacă sunt îndeplinite condiţiile şi NU sunt
îndeplinite criteriile de promovare,
– = 10 dacă PF este în primii 10% din cei promovaţi (A)
– = 9 următorii 25% din cei promovaţi (B)
– = 8 următorii 30% din cei promovaţi (C)
– = 7 următorii 25% din cei promovaţi (D)
– = 6 următorii 10% din cei promovaţi (E)
– = 5 dacă criteriile nu sunt îndeplinite cu o eroare de 3%
şi activitatea generală justifică totuşi o promovare la
limită (max 5% din cei promovaţi)

Algoritmi si programare 2008 5


Bibliografie
T.H. Cormen, C.E. Leiserson, R.L. Rivest:
Introducere in algoritmi, Libris Agora, 2000
D. Lucanu, M. Craus: Proiectarea algoritmilor,
Polirom, 2008
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 si programare 2008 6


Curs 1
• limbaj algoritmic
• tablouri
• structuri
• calculul unui program
• problema rezolvată de un program
• timpul de execuţie

Algoritmi si programare 2008 7


Algoritmi, Limbaj algoritmic
• Problemă, Soluţie
• Algoritm: o secvenţă finită de paşi aranjată într-o
ordine logică specifică, cu proprietatea că atunci
când este executată, produce o soluţie pentru o
problemă dată.
• Exemplu: reţeta culinară
• Algoritm calculator (“computer algorithm”) = un
algoritm pentru care secvenţa de paşi este
executată de un calculator
• Limbaj Algoritmic = un limbaj cu care sunt descrişi
algoritmii
• Muḥammad ibn Musa al-Khwarizmi
Algoritmi si programare 2008 8
al-Khwarizmi
Algoritmi si programare 2008 9
Algoritmi - proprietăţi
• intrare (input) – zero sau mai multe entităţi de
informaţie furnizate din exterior

• ieşire (output) – algoritmul produce informaţie

• terminare – pentru orice intrare, algoritmul


execută un număr finit de paşi

• corectitudine – algoritmul se termină şi produce


ieşirea corectă pentru orice intrare. Spunem că
algoritmul rezolvă problema dată.

Algoritmi si programare 2008 10


Limbaj algoritmic
• modelarea memoriei
• tipuri de date elementare
• instrucţiuni
• tipuri de date structurate de
nivel jos
• calcul
• timp de execuţie

Algoritmi si programare 2008 11


Tip de date
• Domeniul tipului (colecţia de obiecte)
• Operaţiile tipului
• Categorii de tipuri de date:
– Tipuri de date elementare
– Tipuri de date structurate de nivel jos
• Operaţiile la nivel de componentă
– Tipuri de date de nivel înalt
• Operaţiile implementate de algoritmi utilizator

Algoritmi si programare 2008 12


Tipuri de date elementare
• Numere întregi
– Valori: numere întregi
– Operaţii: +, -, ...
• Numere reale
– Valori: numere raţionale
– Operaţii: +, -, ...
• Valori booleene
– valori: true, false
– Operaţii: and, or, not
Algoritmi si programare 2008 13
Variabilă
• Nume
• Adresă
• Atribute (Tip de date asociat valorilor
memorate)
x int
adr

• Instanţă a variabilei

Algoritmi si programare 2008 14


Tipuri de date elementare
• Caractere
– Valori: ‘a’, ‘b’, ...
– Operaţii: nu există
• Pointeri
– Valori: adrese de variabile aparţinând
altui tip, valoarea NULL
– Operaţii: nu
*p int
adr
p int* adr
Algoritmi si programare 2008 15
Tipuri de date elementare
• Pointeri
– Referire indirectă: *p
– Tipul pointer cu domeniul t: t*
• integer*
– Variabile dinamice
• Creare: new(p)
• Distrugere: delete(p)

Algoritmi si programare 2008 16


Tip de date
• Tip de date abstract: tip de date organizat
în aşa fel încât specificarea obiectelor şi
specificarea operaţiilor este independentă de
reprezentarea obiectelor şi implementarea
operaţiilor

• model standard = model utilizat pentru


specificarea tipurilor de date abstracte
(bazat pe notaţii matematice)

Algoritmi si programare 2008 17


Tip de date abstract:
exemple
• INT
– obiecte: int = {. . . –2, –1, 0, 1, 2, . . . }
– operaţii:
• adunarea
– intrare: a, b  int
– iesire: a + b
• ...
• BOOL
– obiecte: bool = {false, true}
– operaţii:
• conjuncţia
– intrare: a, b  bool
– iesire: a  b (a and b)
• ...

Algoritmi si programare 2008 18


Memoria
• Structură liniară de celule
– Variabile

adr
x int

– Pointeri
adr
adr

p int*

*p int
Algoritmi si programare 2008 19
Instrucţiuni
• Atribuirea
– Sintaxa:
<variabilă> ← <expresie>
– Sematica:
• Se evaluează <expresie> şi rezultatul
obţinut se memorează în locaţia desemnată
de <variabilă>
• Este singura instrucţiune cu ajutorul căreia
se poate modifica conţinutul memoriei

Algoritmi si programare 2008 20


Instrucţiuni
• Atribuirea
Înainte de atribuire

u int 40

v int 20

După atribuirea u ← -v*u

u int -800

v int 20

Algoritmi si programare 2008 21


Instrucţiuni
• Atribuirea cazul pointerilor
– Sintaxa:
*<variabilă pointer> ← <expresie>
– Sematica:
• Se evaluează <expresie> şi rezultatul obţinut se
memorează în locaţia de la adresa stocată în <variabilă
pointer>
*p ← 10

*p int 10
adr
p int* adr

Algoritmi si programare 2008 22


Instrucţiuni
• if Expresie cu rezultat
boolean după evaluare
– Sintaxa:
if <expresie>
then <secvenţă-instrucţiuni1>
else < secvenţă-instrucţiuni2 >

if <expresie>
then <secvenţă-instrucţiuni1>

if <expresie> then <secvenţă-instrucţiuni1>

Algoritmi si programare 2008 23


Instrucţiuni
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 si programare 2008 24


Instrucţiuni
• if
– Semantica:
• Se evaluează <expresie>. Dacă rezultatul
este true, atunci se execută <secvenţă-
instrucţiuni1> iar dacă rezultatul este false,
atunci se execută <secvenţă-instrucţiuni2>
după care instrucţiunea if se termină

Algoritmi si programare 2008 25


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 si programare 2008 26
Instrucţiuni
• while Expresie cu rezultat
boolean după evaluare
– Sintaxa:
while <expresie> do
<secvenţă-instrucţiuni>
– Semantica:
1. Se evaluează <expresie>
2. Dacă rezultatul este true atunci se
execută <secvenţă-instrucţiuni> după care
se reia procesul începând cu pasul 1. Dacă
rezultatul este false atunci execuţia
instrucţiunii while se termină
Algoritmi si programare 2008 27
Exemplu while
• cel mai mic k astfel încât 7k >= 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 si programare 2008 28


Instrucţiuni
• repeat
– Sintaxa:
repeat
<secvenţă-instrucţiuni>
until <expresie>

Expresie cu rezultat
boolean după evaluare

Algoritmi si programare 2008 29


Instrucţiuni
• repeat
– Semantica:
Instrucţiunea:
repeat
S
until e
simulează execuţia următorului program
S
while (not e) do
S

Algoritmi si programare 2008 30


Exemplu repeat
• cel mai mic k astfel încât 7k >= 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)
• pentru n = 0 nu mai obţinem
rezultatul corect
Algoritmi si programare 2008 31
Instrucţiuni
• for Variabilă de
tip întreg
Expresii cu rezultat întreg
după evaluare
– Sintaxa:
for <variabilă> ← <expresie1> to <expresie2> do
<secvenţă-instrucţiuni>

sau

for <variabilă> ← <expresie1> downto <expresie2>do


<secvenţă-instrucţiuni>

Algoritmi si programare 2008 32


Instrucţiuni
• 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 si programare 2008 33
Instrucţiuni
• 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 si programare 2008 34
Instrucţiuni
• throw (excepţii) Şir de
– Sintaxa: caractere (text)
throw <mesaj>
– Semantica:
• Execuţia programului se opreşte şi este afişat textul
<mesaj>
• Se foloseşte de obicei cu if:
if <expresie>
then throw <mesaj>
– Exemplu:
new(p)
if (p = NULL)
then throw “memorie insuficienta”

Algoritmi si programare 2008 35


Subprograme
• Limbajul este modular: un program
conţine un număr de module
• Un modul în limbajul prezentat este
identificat cu un subprogram
• Subprograme:
– Proceduri
– Funcţii

Algoritmi si programare 2008 36


Subprograme
• Proceduri: Opţional
Variabile
– Sintaxa:
procedure <nume>(<lista-parametri-formali>)
begin
<secvenţă-instrucţiuni>
Expresii de
end
acelaşi tip
– Apel:
<nume>(<lista-parametri-actuali>)
• Interfaţa între o procedură şi modulul care o
apelează se realizează doar prin intermediul
parametrilor şi a variabilelor globale

Algoritmi si programare 2008 37


Subprograme
• Proceduri:
procedure swap(x, y)
begin
aux ← x
x ← y
y ← aux
end

swap(a, b)
swap(b, c)
Algoritmi si programare 2008 38
Subprograme
• Funcţii: Opţional
Variabile
– Sintaxa:
function <nume>(<lista-parametri-formali>)
begin
<secvenţă-instrucţiuni>
Conţine măcar o
end
instrucţiune
– Apel: return <expr>
<nume>(<lista-parametri-actuali>)
utilizat într-o expresie: valoarea întoarsă de
funcţie este cea obţinută prin evaluarea
<expr>
Algoritmi si programare 2008 39
Subprograme
• Funcţii:
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 si programare 2008 40


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 si programare 2008 41


Calculul unui program
• Configuraţie:
– Instrucţiunea curentă(starea programului)
– Starea memoriei (valorile curente ale
variabilelor din program)
• Relaţia de tranziţie ci-1  ci
– Starea memoriei din ci este obţinută prin
execuţia instrucţiunii din ci-1
– Instrucţiunea din ci este următoarea ce trebuie
executată
• Configuraţie iniţială, configuraţie finală
• Pot exista calcule infinite
Algoritmi si programare 2008 42
Calculul unui program
Pasul Instrucţiunea i x
x ← 0 0 x ← 0 - -
i ← 1 1 i ← 1 - 0
while(i < 4) do
2 i < 4 1 0
x ← x*10+i
3 x ← x*10+i 1 0
i ← i+2
4 i ← i + 2 1 1
Fiecare instructiune se 5 i <4 3 1
execută într-o 6 x ← x*10+i 3 1
unitate de timp
7 i ← i + 2 3 13
T=9
8 i <4 5 13
Algoritmi si programare 2008 43
Tablouri
• Ansamblu omogen de variabile numite
componentele tabloului
• Toate componentele aparţin aceluiaşi tip
• Componentele sunt identificate cu
ajutorul indicilor
• Tablouri:
– Unidimensionale (1 – dimensionale)
– Bidimensionale (2 - dimensionale)

Algoritmi si programare 2008 44


Tablouri unidimensionale
a int[5
]

a[0] int

a[1] int

a[2] int

a[3] int

a[4] int

Algoritmi si programare 2008 45


Tablouri unidimensionale
• Memoria este o secvenţă contiguă de
locaţii
• Ordinea de memorare – ordinea indicilor
• Operaţiile 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 si programare 2008 46


Tablouri bidimensionale
• Memorie contiguă de mn locaţii
• 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 si programare 2008 47


Tablouri bidimensionale
a int[3,3]

a[0,0] int

a[0,1] int

a[0,2] int

a[1,0] int

a[1,1] int

a[1,2] int

Algoritmi si programare 2008 48


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.
• Notaţie:
a[0][0], a[0][1], …, a[0][n-1],…,
a[m-1][0], a[m-1][1],…, a[m-1][n-1]
Algoritmi si programare 2008 49
Tablouri bidimensionale
• Un tablou 1-dimensional cu componente
tablouri 1-dimensionale poate fi schiţat
astfel:

a tab2d

a[0] tab1d

a[1] tab1d

Algoritmi si programare 2008 50


Tablouri bidimensionale
• Operaţiile 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 si programare 2008 51


Şiruri de caractere
• Pot fi considerate ca fiind tablouri
unidimensionale cu elemente de tip
caracter.
• Constantele şir de caracter se notează
utilizând “ ”: “Şir-de-caractere”
• Operaţii:
– Concatenarea, notată cu +:
“un sir” + “alt sir” = “un siralt sir”

Algoritmi si programare 2008 52


Structuri statice
• Structură: ansamblu eterogen de variabile
numite cîmpuri; structura are un nume şi
fiecare câmp are propriul nume şi propriul
tip.
• Numele complet al unui câmp:
persoana.varsta, persoana.prenume,
persoana.adresa.strada, punct.x,
punct.y
p->varsta, pp->x
• Memoria alocată este o zonă contiguă;
elementele sunt memorate în ordinea
declarării în structură
Algoritmi si programare 2008 53
Structuri (articole)

d data

d.z zi

d.ln luna

d.a an

Algoritmi si programare 2008 54


Structuri si pointeri

d data*

*d data

dz zi

dln luna

da an

Algoritmi si programare 2008 55


Timpul de execuţie î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 si programare 2008 56


Notaţia O(f(n))
• funcţii f(n) de argument număr natural şi valori
numere reale pozitive
• O(f(n)) = clasa funcţiilor mărginite superior
asimptotic de funcţia f(n)
• g(n)O(f(n)) dacă există c>0, n0 natural,
astfel încât g(n)≤c*f(n) pentru orice n≥n0
• funcţiile constante  O(1)
• polinoamele de grad 1  O(n)
• polinoamele de grad 2  O(n2)
• funcţii logaritmice  O(log n)
• Notaţie: T(n) = O(n) în loc de T(n)  O(n)

Algoritmi si programare 2008 57

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