Sunteți pe pagina 1din 8

1. Noiuni de baza: Algoritm, Structuri de date, et.

n informatic, o structur de date este o metod sistematic de stocare a informaiilor i datelor ntr-un
calculator, n aa fel nct ele s poat fi folosite n mod eficient. Deseori o alegere bine fcut a structurii de
date va permite i implementarea unui algoritm eficient. Structura de date aleas este derivat de multe ori dintr-
un tip de dat abstract. O structur de date bine conceput permite efectuarea unei varieti de operaii de baz,
utiliznd puine resurse (ca de exemplu memoria necesar i timpul de execuie). Structurile de date se
implementeaz utiliznd tipuri de date, referine i operaii asupra acestora, toate facilitate de ctre un limbaj de
programare.
Un algoritm (cuvntul are la origine numele matematicianului persan Al-Khwarizmi) nseamn
n matematic i informatic o metod sau o procedur de calcul, alctuit din paii elementari necesari pentru
rezolvarea unei probleme sau categorii de probleme. De obicei algoritmii se implementeaz n mod concret prin
programarea adecvat a unui calculator, sau a mai multora. Din diverse motive exist i algoritmi nc
neimplementai, teoretici.
-------------------------------------------------------------------------------------
2. Masina Turing (referat,video).
Fondatorul Mainii Turing-Alan Turing(1912-1954) .n construcia teoretic a acestei maini, a pornit de la o
idee inspirat de maina de scris; astfel, maina de scris poate fi considerat ca avnd o memorie de lungime
infinit (prin schimbarea continu a foilor), se poate mica nainte i napoi la o csu de memorie, poate scrie
n aceste csue.
Maina Turing este compus din urmtoarele piese:
1. band infinit de hrtie cu ptrele - n fiecare ptrel se poate scrie exact un caracter din alfabetul
nostru;
2. un cap de citire-scriere - se poate mica deasupra benzii, la stnga sau la dreapta;
3. unitate de control- conine un numr finit de reguli care indic mainii ce s fac la fiecare micare
n funcie de litera curent de pe band i starea n care maina se afl.
O main Turing funcioneaz cu un set finit de stri
S={s1,.sn; sn+1=stop} un alfabet finit de simboluri
A={a1aA; aA+1= blank} i un set finit de instruciuni , la care se adaug o band infinit de lung de
memorie.
1. Strile corespund la moduri de funcionare a mainii, astfel nct maina Turing este n exact una dintre
aceste stri la orice moment de timp.
2. Simbolurile din A codeaz informaia prelucrat de main: codeaz datele de intrare/ieire i pstreaz
rezultatele operaiilor intermediare.
Instruciunile sunt asociate cu stri din S i spun mainii ce aciune s efectueze dac ntlnete un
simbol dat, i n ce stare s fie dup efectuarea acestei aciuni.
3. Exist o stare stop n urma creia nu se efectueaz nici o instruciune, aceast stare nefiind inclusn
numrul total de stri.
---------------------------------------------------------------------------------

3. Structuri de date. Clasificarea. C versus C++.
2. Clasificarea structurilor de date :
I. Structuri de date elementare :
- tablouri ( vectori, matrici, iruri de caractere )
- nregistrare
- mulime
- fiiere
II. Structuri de date dinamice :
- structura de tip list ( list simplu nlnuit, dublu nlnuit, circular, stiv, coad )
- structura de tip arbore: arbori binari, arbori binari de cautare, arbori oarecare
Limbajul de programare C este un limbaj de programare a calculatoarelor, conceput de Dennis Ritchie la
nceputul anilor 1970.
C++ este o extindere a limbajului C. Limbajului C++ este contituit ca un superset al limbajului C. Aceasta
nseamn c orice program scris n limbajul C este n acelai timp i un program scris n limbajul C++.
Trebuie ns s remarcm c aceast afirmaie este adevrat cu mici excepii.
Ex: compilatorul C++ face unele controale suplimentare fa de compilatorul C. Aceste controale se refer
nprimul rnd la tipurile parametrilor funciilor, precum i la tipurile valorilor returnate de ele.
Cu C++ scriem "clase" de obiecte, pe cnd cu C vom scrie doar functii si proceduri. In felul acesta (se spune
ca) C++ ar fi mai intuitiv si mai usor de implementat decat C.
Ca i limbajul C, limbajul C++ se bucur de o portabilitate mare i este implementat pe o gam larg
decalculatoare ncepnd cumicrocalculatoare i pn la cele maimari supercalculatoare. ntrediferitele
implementri ale limbajuluiC++ exist diferene legate despecificul calculatoarelor, dar acestediferene nu sunt
eseniale.
Cele mai importante diferene ntre C/C++ sunt:
1.inline funciile inline apar n seciunea de declarare a variabilelor globale n C++, iar in C acestea apar n
aa zisele fiiere statice.
2. Cuvntul cheie bool are n C99 propriul su header, <stdbool.h>. n variantele anterioare de C tipul de date
boolean nu era definit, n schimb erau folosite o serie de metode (incompatibile) pentru a simula acest tip de
date.
3.Constantele caracter (cuprinse ntre apostrofuri) au dimensiunea unui int n C i char n C++. Cu alte
cuvinte, n C, sizeof('a') == sizeof(int); n C++, sizeof('a') == sizeof(char). Chiar i n aceste condiii, valoarea
acestui tip de constante nu va depi valoarea maxim ce poat fi pstrat de char, deci o conversie de
genul (char)'a' este sigur.\
----------------------------------------------------------------------------------------

4.Algoritmi combinatoriali. Introducere.

In foarte multe aplicatii ale matematicii se cere determinarea numarului de elemente ale unor multimi,
numarul submultimilor unei multimi satisfacand anumite proprietati sau numarul modalitatilor de dispunere a
elementelor multimii intr-o ordine specificata:
Anumite probleme de numarare apar frecvent in aritmetica, geometrie, teoria numerelor, probabilitati,
statistica. In cursul dezvoltrii matematicii s-a conturat o noua ramura a acesteia, care se ocupa cu aspectele
ridicate de operatia de numarare:combinatorica.

5.Permutari, Combinari, Aranjamente.
Permutarile unei multimi
Fie A={a1, a2, , an} o multime finita cu n elemente.Multimea A se poate ordona in mai multe moduri.
Definitie.Se numeste permutare a multimii A oricare multime ordonata care se formeaza cu cele n elemente ale
acesteia. Numarul permutarilor unei multimi cu n elemente se noteaza Pn. Convenim ca multimea vida se poate
ordona intr-un singur mod si P0=1.
Aranjamente sicombinari. Fie A={a1, a2, ,an} o multime finita cu n elemente si m {0, 1, 2, ,n} Se
stie ca multimea A are in total 2 submultimi.
Combinari
Definitie
Submultimile multimii A avand fiecare cate m elemente se numesc combinari de n elemente luate cate m.
Numarul combinarilor de n elemente luate cate m se noteaza Cn.


Aranjamente
Definitie
Submultimile ordonate cu m elemente ale multimii A se numesc aranjamente de n elemente luate cate m.
Numarul aranjamentelor de n elemente luate cate m se noteaza An
Se observa ca doua combinari de n elemente luate cate m se deosebesc prin natura elementelor.
Doua aranjamente de n elemente luate cate m se deosebesc prin natura elementelor sau prin ordinea acestor
elemente.
Fiecare submultime cu m elemente poate fi ordonata in m! moduri. Rezulta, asadar, ca vom avea de m! ori
mai multe aranjamente de n elemente luate cate m decat combinari de n elemente luate cate m.

Se obtin relatiile:An=m!Cn sau Cn=An/m! (1)

Relatiile (1) permit aflarea unui numar cunoscand celalalt numar dintre An si Cn.

Teorema
Fie A o multime finita cu n elemente si 0 m n un numar natural. Atunci:
An=n!/(n-m)! (2)

6.Formule Herigonne, Pascal. Demonstratie. Exemple si aplicatii practice.

Formula lui Pascal
Cn+Cn++Cn=2

Demonstratie
Fie A={a1, a2, ,an} o multime finita.Numarul tuturor submultimilor cu 0, 1, 2, , n elemente ale lui
A.Acestea sunt in numar de Cn, Cn,,Cn
Prin adunare rezulta relatia ceruta.

Formula Herigonne
, sau

Teorema
Cn=n!/(n-m)!m!

Formula combinarilor a fost stabilita in 1634 de catre matematicianul francez Pierre Herigonne.

7. Recursia. Algoritm recursiv. Functii recursive. Exemple: n! ; Numerele lui Fibbonacci.

Recursivitatea, folosita cu multa eficienta in matematica, s-a impus in programare, odata cu aparitia unor
limbaje de nivel inalt, ce permit scrierea de module ce se autoapeleaza (PASCAL,LISP,ADA,ALGOL,C sint
limbaje recursive).
Orice program recursiv poate fi transformat in unul iterativ, dar algoritmul sau poate deveni mai complicat si
mai greu de inteles. De multe ori, solutia unei probleme poate fi elaborata mult mai usor, mai clar si mai simplu
de verificat, printr-un algoritm recursiv.
Exista:
1. Algoritmi de traversare si inversare a unei structuri
2. Algoritmi care implementeaza definitii recursive
Tipuri de algoritmi:
1. Algoritmi de divizare
procedure rezolva(x:problema);
begin
if {x e divizibil in subprobleme} then
begin
{divide pe x in parti x1,...,xk}
rezolva(x1); {...} rezolva(xk);
{combina solutiile partiale intr-o}
{solutie pentru x}
end
else {rezolva pe x direct}
end;
2. Algoritmi cu revenire (backtracking)
3. Algoritmi "inlantuie si limiteaza" (Branch and Bound)
--------------------------------------------------------------------
8.Sortare prin simpl inserare (Straight insertion). Posibilitati de imbunatatire a metodei.

1. Cazul mediu : O(N^2)
2. Cazul defavorabil : O(N^2)
3. Memorie folosita : O(1)
4. Stabil : DA
5. Sortare descrescatoare : j > 0 && a[j - 1] < a[j]
6. Sortare crescatoare : j > 0 && a[j - 1] > a[j]
Analiza :
Spre deosebire de alti algoritmi de sortare, sortarea prin insertie este folosita destul de despentru sortarea
tablourilor cu numar mic de elemente. De exemplu, poate fi folosit pentru a imbunatati rutina de sortare rapida.
Sortarea prin insertie seamana oarecum cu sortarea prin selectie. Tabloul este impartit imaginar in doua
parti - o parte sortata si o parte nesortata. La inceput, partea sortata contine primul element al tabloului si partea
nesortata contine restul tabloului. La fiecare pas, algoritmul ia primul element din partea nesortata si il insereaza
in locul potrivit al partii sortate.
Cand partea nesortata nu mai are nici un element, algoritmul se opreste.
-------------------------------------------------------------------------------------
9.Sortare prin simpl selectare (Straight selection). Posibilitati de imbunatatire a metodei.
1. Cazul mediu : O(N^2)
2. Cazul defavorabil : O(N^2)
3. Memorie folosita : O(1)
4. Stabil : DA
5. Sortare descrescatoare : min < a[j]
6. Sortare crescatoare : min > a[j]
Analiza :
Acest algoritm selecteaza la fiecare pas`ul i cel mai mic element din vectorul de la pasul i+1 pana la
n.Valoarea minima de la pasul i este pusa in vector la pozitia i,facandu-se intereschimbarea cu pozitia actuala a
minimului.Nu este un algoritm indicat pentru vectorii mari, in majoritatea cazurilor oferind rezultate mai slabe
decat insertion sort si bubble sort .
-------------------------------------------------------------------------------------
10.Sortare prin simplu schimb (Buble sort). Posibilitati de imbunatatire a metodei.

1. Cazul mediu : O(N^2)
2. Cazul defavorabil : O(N^2)
3. Memorie folosita : O(1)
4. Stabil : DA
5. Sortare descrescatoare : a[i] < a[i+1]
6. Sortare crescatoare : a [i] > a[i+1]
Analiza :Sortarea prin metoda bulelor se considera drept una din cele mai putin efective metode desortare dar
cu un algoritm mai putin complicat.Ideea de baza a sortarii prin metoda bulelor este in a parcurge tabloul de la
stanga spre dreapta,fiind comparate elementele alaturate a[ i ] si a[i+1]. Daca vor fi gasite 2 elemente
neordonatevalorile lor vor fi interschimbate
------------------------------------------------------------------
11. Sortare de tipul Shaker. (Shakersort).

Principiu: reprezinta o varianta a metodei bubblesort, avind urmatoarele imbunatatiri:
-la fiecare parcurgere a subtabloului a[i],...,a[N] se memoreaza indicele k al ultimei interschimbari efectuate,
astfel incit la urmatoarea trecere un capat al subtabloului va fi marcat de k (intre 1 si k tabloul este ordonat);
-se schimba alternativ sensul de parcurgere al subtablourilor pentru doua treceri consecutive.
Implementarea algoritmului in Pascal:
procedure ShakerSort;
VAR j,k,l,r : TipIndex; x : TipElement;
begin
l:=2; r:=N; k:=N;
repeat
for j:=r downto l do
if a[j-1].cheie>a[j].cheie then begin
x:=a[j-1];
a[j-1]:=a[j];
a[j]:=x;
k:=j
end;
l:=k+1;
for j:=l to r do
if a[j-1].cheie>a[j].cheie then begin
x:=a[j-1];
a[j-1]:=a[j];
a[j]:=x;
k:=j
end;
r:=k-1
until l > r
end; {ShakerSort}
La sortarile bubblesort si shakersort, M si C sint proportionali cu N*N, metodele fiind mai putin performante
decit cele anterioare.
12.Parametrii care reflecta eficienta algoritmelor si programelor.
Pentru rezolvarea unei probleme exista de obicei mai multi algoritmi. Cand analizam un algoritm intai
trebuie sa ne asiguram ca algoritmul duce la rezolvarea problemei si apoi sa vedem cat de eficient o face.
Analiza unui algoritm presupune determinarea timpului necesar de rulare al algoritmului. Acesta nu se
masoara in secunde, ci in numarul de operatii pe care le efectueaza. Numarul de operatii este strans legat de
timpul efectiv de executie (in secunde) a algoritmului, dar nu acesta nu constituie o modalitate de masurare a
eficientei algorimului deoarece un algoritm nu este "mai bun" decat altul doar daca il vom rula pe un calculator
mai rapid sau este"mai incet" daca il rulam pe un calculator mai putin performant. Analiza algoritmilor se face
independent de calculatorul pe care va fi implementat sau de limbajul in careva fi scris. In schimb, presupune
estimarea numarului de operatii efectuate.
. Sigur ca eficienta unui algoritm depinde si de spatiul de memorie necesar rularii algoritmului. Un rol
important in evaluarea eficientei unui algoritm il au valorile de intrare pentru care se aplica algoritmul.
Cand se face analiza unui algoritm trebuie sa se ia in considerare toate clasele de valori de intrare posibile.
Numim cel mai bun caz, cazul in care se efectueaza cele mai putine operatii,cel mai rau caz este cazul in care
se efectueaza cele mai multe operatii. Asa cum am discutat mai sus, orice algoritm prezinta un necesar de timp
si de memorie ce formeaza asa numita complexitatea algoritmului. Sigur ca nu vom putea calcula chiar timpul
de executie a algoritmului ci vom determina o functie care depinde de marimea problemei de rezolvat si care
este direct proportionala cu timpul de executie. Aceasta functie examineaza modul de crestere al timpului de
executie in cazul cresterii marimei problemei rezolvate de catre algoritm. Aceasta functie se numeste rata de
crestere a algoritmului. Comparand functiile de crestere a doi algoritmi putem determina care dintre ei este mai
rapid si deci eficient. Pentru un algoritm dat, vom putea estima timpul minim, adica timpul de executie in cazul
cel mai bun si timpul maxim, adica timpul de executie in cazul cel mai rau. Cele doua cazuri extreme apar
foarte rar si o analiza completa presupune determinarea timpului mediu de executie definit ca media aritmetica a
timpilor de executie corespunzatoare tuturor cazurilor posibile. Din pacate, acest lucru este mai greu si uneori
ne vom limita la estimarea timpului maxim al unui algoritm.




13.Sortarea cu micsorarea incrementului. ( Shell Sort)

Sortarea cu micsorarea incrementului (shellsort) este o extensie simpl al Insertion sortului care cstig
vitez permitnd schimbarea elementelor aflate departe. Ideea de baz o constituie rearanjarea elementelor din
tabela A n asa fel nct, lund
fiecare a h-a element (ncepnd de oriunde), s obtinem o tabel sortat. Astfel spunem c tabela este h-sortat.
O tabel , h-sortat este format din h subtabele sortate independent, intercalate. Folosind astfel o procedur
pentru fiecare secvent a valorii lui h care se termin n 1, va produce o tabel sortat.
Algoritmul este :
shell-sort (a)
h 1
pana cand h<n/9
h 3*h+1
pana cand h>0
pentru i h+1 pana la n
t a[i]
j i
pana cand (j>h si a[j-h] > t)
interschimba(a[j], a[j-h])
j j-h
h h/3
-------------------------------------------------------------------------------------

14.Sortarea prin intermediul arborilor. Sortarea piramidala. (Heapsort)
Algoritmul HeapSort.
Este un algoritm, care a primit deumirea de aranjarea piramidala (HeapSort). Ideea sa consta din: in loc de
completare aborele se formeaza un sir a[1], a[2],,a[n] aranjat in piramida , aranjarea consta ca fiecare a[i] sa
indeplineasca conditia a[i]<=a[2i]si a[i]<=a[2i+1]. Apoi piramida se foloseste pentru aranjare. Cea mai clara
metoda de constructi a piramidei,se uita la aranjarea sirul intr-un arbore, prezentat in fig.2.9. Sirul este
reprezentat ca arbore binar a carui virf corespunde cu elimentul sirului a[1]. La nivelul doi se gasesc elementele
a[2]si a[3]. La nivelul trei a[4],a[5], a[6] a[7] si asa mai departe. Se observa ca petru un sir cu un numar impar
de elemente, arborele va fi echilibrat, dar pentr-un un sir cu un numar par de elimente, n elimente a[n] va fi in
partea stinga a foii asemanator cu un arbore
15.Algoritmul QuickSort

Metoda de sortare a fost propus de ctre Charles Hoare n 1962. Aceast metod este dezvoltarea unei
metode simple de schimb i att de eficient, nct a devenit cunoscut sub numele de metoda de sortare
rapid QuickSort. Ideea de baz a algoritmului const n faptul c selecteaz la ntmplare un element x al
matricei, dup aceasta matricea se analizeaz din stnga, pn cnd nu ntlnete elementul a[i] astfel nct a[i]>x
, i apoi matricea se studiaz din partea dreapt, pn cnd nu ntlnete elementul a[j] astfel nct a[j]<x. Aceste
2 elemente sunt schimbate, precum i procesul de vizualizare, compararea i schimbul continu pn cnd vom
ajunge la elementul x. n rezultat, matricea se divide n dou pri stnga i dreapta, n partea stnga valorile
cheie vor fi mai mici dect x, iar n partea dreapt valorile cheie vor fi mai mari dect x. n continuare procesul
continu recursiv pentru partea stng i dreapt a matricei, pn cnd fiecare parte nu va conine exact un
element. Cunoatem, ca de obicei , recursia poate fi nlocuit prin iteraii, dac s pstrm n memorie indicii
corespunztori din matrice. S urmm acest proces, ca de exemplu, n matricea noastr standard (tabel
2.6).Tabelul 2.6. Exemplu QuickSort.
Algoritmul nu este numit fara motiv sortarea rapid,ntructpentru evaluarea lui numrul de comparaii i
schimburi este O(nlogn). De fapt, de cele mai multe ori, tablourile de sortare utilizeaz anume acest algoritm.
mbuntiri
n practic pentru a crete viteza, dar nu cea asimptotic, putem face cteva optimizri:
n cazul funciei de partiie elementul central este selectat n mijloc. Aceast alegere mbuntete estimarea
timpului mediu, n cazul n care matricea este ordonat parial.
1'. Putem selecta media din primele elemente, ultimele i cele mijlocii. Maxim Razin: n acest caz, numrul
de treceri va scdea de 7/6 ori.
1. Pentru matrici mai scurte se numete sortare prin inserare. Din cauza recursiei i a altor calcule
adaugtoare QuickSort nu este un algoritm eficient pentru tablouri mici.
2. Dac ultimul operator al funciei este un apel la aceast funcie, atunci se numete coad-recursiv.
Aceasta are sens s fie nlocuit prin iteraii n acest caz mai bine de utilizat stiva.
3. Dup rupere mai nti se sorteaz prima seciune. Aici, de asemenea, mai bine de utilizat stiva, ntruct
seciunile mici se sorteaz mai rapid i ele au nevoie de o stiv mai mic. Cerinele de memorie sunt reduse
de la n la logn.

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