Alg2004 Curs1
Alg2004 Curs1
Alg2004 Curs1
- Noţiunea de algoritm
- Obiectul disciplinei
- Proprietăţi ale algoritmilor
- Date
- Tipuri de prelucrări
- Exerciţii
1 Noţiunea de algoritm
În termeni generali un algoritm este o metodă de rezolvare pas cu pas a problemelor. O problemă se
consideră a fi constituită din date de intrare şi un enunţ care specifică relaţia existentă ı̂ntre datele
de intrare şi soluţia problemei. În cadrul algoritmului sunt descrise prelucrările necesare pentru a
obţine soluţia problemei pornind de la datele de intrare. În continuare considerăm că
Un algoritm este o succesiune bine precizată de prelucrări care aplicate asupra datelor
de intrare ale unei probleme permit obţinerea ı̂n timp finit a soluţiei acesteia.
2 Obiectul disciplinei
Obiectul disciplinei de ”Algoritmică” ı̂l reprezintă studiul algoritmilor din perspectiva elaborării şi
analizei lor. Elaborarea unui algoritm necesită:
1
Analiza algoritmilor presupune verificarea corectitudinii acestora şi a eficienţei. Un algoritm
este considerat corect dacă prin aplicarea lui asupra datelor problemei conduce la soluţia acestuia şi
eficient dacă prin execuţia acestuia rezultatul se obţine intr-un interval de timp rezonabil. Analiza
presupune aplicarea unor tehnici de demonstrare specifice matematicii.
Indiferent de complexitatea unei aplicaţii informatice, la bazele ei stau algoritmi destinaţi re-
zolvării problemelor fundamentale ale aplicaţiei. Oricât de sofisticată ar fi tehnologia software
utilizată (interfeţe, structurare globală a aplicaţiei) eficienţa aplicaţiei este ı̂n mod esenţial deter-
minată de eficienţa algoritmilor implicaţi. Un algoritm prost conceput nu poate fi ”reparat” prin
artificii de programare. Din acest motiv dobandirea unor cunostinte solide privind elaborarea si
analiza algoritmilor este o condiţie necesară ı̂n formarea unui bun programator.
Generalitate. Un algoritm destinat rezolvării unei probleme trebuie să permită obţinerea rezul-
tatului pentru orice date de intrare şi nu numai pentru date particulare de intrare.
Finitudine. Un algoritm trebuie să admită o descriere finită şi fiecare dintre prelucrările pe care
le conţine trebuie să poate fi executată ı̂n timp finit. Prin intermediul algoritmilor nu pot fi
prelucrate structuri infinite.
Rigurozitate. Prelucrările algoritmului trebuie specificate riguros, fără ambiguităţi. În orice etapă
a execuţiei algoritmului trebuie să se ştie exact care este următoarea etapă ce va fi executată.
Eficienţă. Algoritmii pot fi efectiv utilizaţi doar dacă folosesc resurse de calcul ı̂n volum acceptabil.
Prin resurse de calcul se ı̂nţelege volumul de memorie şi timpul necesar pentru execuţie.
Exemple.
1.Nu orice problemă poate fi rezolvată algoritmic. Considerăm un număr natural n şi următoarele
două probleme: (i) să se construiască mulţimea divizorilor lui n; (ii) să se construiască mulţimea
multiplilor lui n. Pentru rezolvarea primei probleme se poate elabora uşor un algoritm, ı̂n schimb
pentru a doua problemă nu se poate scrie un algoritm atâta timp cât nu se cunoaşte un criteriu de
oprire a prelucrărilor.
2.Un algoritm trebuie să funcţioneze pentru orice dată de intrare. Să considerăm problema ordonării
crescătoare a şirului de valori: (2, 1, 4, 3, 5). O modalitate de ordonare ar fi următoarea: se compară
primul element cu al doilea iar daca nu se află ı̂n ordinea bună se interschimbă (ı̂n felul acesta se
obţine (1, 2, 4, 3, 5)); pentru şirul astfel transformat se compară al doilea element cu al treilea şi dacă
nu se află ı̂n ordinea dorită se interschimbă (la această etapă şirul rămâne neschimbat); se continuă
procedeul până penultimul element se compară cu ultimul. În felul acesta se obţine (1, 2, 3, 4, 5).
Deşi metoda descrisă mai sus a permis ordonarea crescătoare a şirului (2, 1, 4, 3, 5) ea nu poate
fi considerată un algoritm de sortare ı̂ntrucât dacă este aplicată şirului (3, 2, 1, 4, 5) conduce la
(2, 1, 3, 4, 5).
2. Un algoritm trebuie să se oprească. Se consideră următoarea secvenţă de prelucrări:
2
Pas 3. Dacă x este egal cu 100 atunci se opreşte prelucrarea altfel se reia de la Pas 2.
Este uşor de observat că x nu va lua niciodată valoarea 100, deci succesiunea de prelucrări nu se
termină niciodată. Din acest motiv nu poate fi considerată un algoritm corect.
3. Prelucrările dintr-un algoritm trebuie să fie neambigue. Considerăm următoarea secvenţă de
prelucrări:
Atât timp cât nu se stabileşte un criteriu după care se decide dacă x se măreşte sau se micşorează
secvenţa de mai sus nu poate fi considerată un algoritm. Ambiguitatea poate fi evitată prin uti-
lizarea unui limbaj riguros de descriere a algoritmilor. Să considerăm că Pas 2 se ı̂nlocuieşte cu:
Pas 2. Se aruncă o monedă. Dacă se obţine cap se măreşte x cu 1 iar dacă se obţine pajură se
micşorează x cu 1;
În acest caz specificarea prelucrărilor nu mai este ambiguă chiar dacă la execuţii diferite se obţin
rezultate diferite. Ce se poate spune despre finitudinea acestui algoritm ? Dacă s-ar obţine alter-
nativ cap respectiv pajură, prelucrarea ar putea fi infinită. Există ı̂nsă şi posibilitatea să se obţină
de 11 ori la rând cap (sau pajură), caz ı̂n care procesul s-ar opri după 11 repetări ale pasului 2.
Atât timp cât şansa ca algoritmul să se termine este nenulă algoritmul poate fi considerat corect
(ı̂n cazul prezentat mai sus este vorba despre un algoritm aleator).
4. Un algoritm trebuie să se oprească după un interval rezonabil de timp. Să considerăm că
rezolvarea unei probleme implică prelucrarea a n date şi că numărul de prelucrări T (n) depinde de
n. Presupunem că timpul de execuţie a unei prelucrări este 10−3 s şi că problema are dimensiunea
n = 100. Dacă se foloseşte un algoritm caracterizat prin T (n) = n atunci timpul de execuţie va fi
100 × 10−3 = 10−1 secunde. Dacă, ı̂nsă se foloseşte un algoritm caracterizat prin T (n) = 2n atunci
timpul de execuţie va fi de circa 1027 secunde adică aproximativ 1019 ani.
4 Date
Prelucrările efectuate ı̂n cadrul unui algoritm se efectuează asupra unor date. Acestea sunt entităţi
purtătoare de informaţie (relevantă pentru problema de rezolvat). Considerăm datele ca fiind
containere ce conţin informaţie, valoarea curentă a unei date fiind informaţia pe care o conţine la
un moment dat.În funcţie de rolul jucat ı̂n cadrul algoritmului datele pot fi constante (valoarea lor
rămâne nemodificată pe parcursul algoritmului) sau variabile (valoarea lor poate fi modificată).
Din punctul de vedere al informaţiei pe care o poartă datele pot fi:
• Simple: conţin o singură valoare (poate fi un număr, o valoare de adevăr sau un caracter).
• Structurate: sunt constituite din mai multe date simple ı̂ntre care există o relaţie de structură.
Dacă toate datele componente au aceeaşi natură atunci structura este omogenă, altfel este o
structură heterogenă.
3
Datele structurate omogene ce vor fi utilizate ı̂n continuare sunt cele destinate reprezentării
unor structuri algebrice simple: mulţime finită (ansamblu de valori distincte pentru care nu are
importanţă ordinea ı̂n care sunt reţinute), şir finit (ansamblu de valori nu neapărat distincte pentru
care are importanţă ordinea ı̂n care sunt reţinute) şi matrice (tabel bidimensional de valori).
Pentru reprezentarea acestor date vom folosi structura de tablou caracterizată prin faptul că
fiecare valoare componentă poate fi specificată prin precizarea unuia sau mai multor indici. Cel
mai frecvent sunt folosite tablourile unidimensionale (pentru reprezentarea şirurilor şi mulţimilor)
şi cele bidimensionale (pentru reprezentarea matricilor).
5 Tipuri de prelucrări
Asemenea datelor şi prelucrările pot fi clasificate ı̂n simple şi structurate. Prelucrările simple sunt:
• Atribuire. Permite afectarea unei valori unei variabile. Valoarea atribuită poate fi rezultatul
evaluării unei expresii. O expresie descrie un calcul efectuat asupra unor date şi conţine oper-
anzii (specifică datele asupra cărora se efectuează calculele) şi operatori (specifică prelucrările
ce se vor efectua).
• Transfer. Permit preluarea datelor de intrare ale problemei şi furnizarea rezultatului.
• Control. În mod normal prelucrările din algoritm se efectuează ı̂n ordinea ı̂n care sunt spec-
ificate. În cazul ı̂n care se doreşte modificarea ordinii naturale se transferă controlul execuţiei
la o anumită prelucrare.
• De decizie (alternativă). Permite specificarea situaţiilor ı̂n care ı̂n funcţie de realizarea sau
nerealizarea unei condiţii se efectuează o prelucrare sau o altă prelucrare. Condiţia este
de regulă o expresie a cărui rezultat este o valoare logică (adevărat sau fals). O astfel de
prelucrare apare de exemplu ı̂n evaluarea unei funcţii definite prin:
−1 dacă x < 0
f (x) = 0 dacă x = 0
1 dacă x > 0
4
6 Exerciţii.
1. Se consideră următoarea metodă de ı̂nmulţire a două numere ı̂ntregi x şi y. Se scrie x alături
de y (pe aceeaşi linie). Se ı̂mparte x la 2 şi câtul impărţirii se scrie sub x (restul se ignoră).
Se inmulţeşte y cu 2 iar produsul se scrie sub y. Procedeul continuă construindu-se astfel
două coloane de numere. Calculele se opresc ı̂n momentul ı̂n care pe prima coloană se obţine
valoarea 1. Se adună toate valorile de pe coloana a doua care corespund unor valori impare
aflate pe prima coloană.
Este metoda descrisă un algoritm ? Este el corect (determină produsul celor două numere) ?
Indicaţie. Ca urmare a ı̂mpărţirilor succesive la 2 valorile de pe prima coloană descresc până
se ajunge la un cât egal cu 1. Prin urmare prelucrarea este finită. Corectitudinea prelucrării
derivă din faptul că metoda realizează de fapt conversia ı̂n baza 2 a primului număr iar
produsul se obţine prin ı̂nmulţirea succesivă a celui de al doilea număr cu puteri ale lui 2
şi prin ı̂nsumarea acelor produse care corespund unor cifre nenule ı̂n reprezentarea binară a
primului număr.
3. Considerăm că o vânzătoare dispune doar de monede de 2 unităţi şi 5 unităţi. Propuneţi un
algoritm care să stabileasca modul de plată a unui rest (restul este de cel puţin 4).
Indicaţie. Dacă restul este un număr par atunci vânzătoarea poate da doar monede de 2.
Dacă numărul este impar vănzătoarea poate da o monedă de 5 iar ceea ce ramâne (un număr
par) ı̂n monede de 2.
4. La un restaurant bucătarul a pregătit clătite pe care le-a aşezat pe un platou sub forma unei
stive. Din păcate nu toate clătitele au acelaşi diametru astfel că stiva nu arată prea frumos.
Chelnerul ia platoul şi având la dispoziţie o spatulă reuşeşte să aranjeze cu o singură mână
clătitele astfel ı̂ncât să fie ı̂n ordinea descrescătoare a diametrelor. Cum a procedat? Descrieţi
problema ı̂ntr-o manieră abstractă.
Indicaţie. Rearanjarea se face efectuând doar mişcări de răsturnare a unui ”set” de clătite
dintre cele aflate in partea de sus.
5
X X
astfel ı̂ncât B ∪ C = A şi | a− a| este minimă. Cea mai simplă metodă este cea a
a∈B a∈C
”forţei brute” prin care se generează toate perechile de submulţimi (B, C) şi se alege cea care
minimizează diferenţa specificată. Numărul de partiţii distincte este 2n−1 − 1 dacă n este
n/2
impar şi 2n−1 − 1 + Cn /2 dacă n este par. Pentru n mare, numărul de partiţii ce trebuie
testate devine mare (pentru n = 10 este 637 iar pentru n = 100 este de ordinul 1029 . Ar
trebui găsită o metodă mai eficientă ...