Documente Academic
Documente Profesional
Documente Cultură
Ludmila NOVAC
Dr., conf. univ.
Dep. Informatică
Bibliografie recomandată
1. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
Introduction to Algorithms.
2. D. E. Knuth. Tratat de programarea calculatoarelor. Volum I. Algoritmi
fundamentali. Editura tehnică. Bucureşti, 1974.
3. D. E. Knuth. Tratat de programarea calculatoarelor. Volum III. Sortare şi
căutare. Editura tehnică. Bucureşti, 1974.
4. Dorel Lucanu. Bazele proiectării programelor şi algoritmilor. Volum II. Tehnici
de programare. Editura Universităţii „Al. I. Cuza”, Iaşi, 1996.
5. Dorel Lucanu. Bazele proiectării programelor şi algoritmilor. Volum III.
Proiectarea algoritmilor. Editura Universităţii „Al. I. Cuza”, Iaşi, 1996.
6. Tudor Sorin. Tehnici de programare. Editura Teora, Bucureşti, 1997.
7. Octavian Catrina, Iuliana Cojocaru, Turbo C++, Editura Teora, Bucureşti,
1994.
8. Emanuela Cerchez, Marinel Şerban, Programarea in limbajul C/C++. Vol. 2,
Metode şi tehnici de programare, Polirom, Iaşi, 2005.
9. Emanuela Cerchez, Marinel Şerban, Programarea in limbajul C/C++. Vol. 3,
Polirom, Iaşi, 2006.
Unităţi de conţinut
1. Noţiunea de structură abstractă de date. Reprezentarea structurilor în MO a
calculatorului. Clase abstracte şi algoritmi pentru construirea elementelor de
date. Clase derivate.
2. Tabele. Problema de căutare, aprecierea complexităţii algoritmilor de
căutare, viteza medie de căutare, lungimea medie de căutare. Tabele neordonate
simple. Algoritmul căutării secvenţiale. Tabele neordonate structurate
arborescent.
3. Tabele ordonate. Tabele ordonate după cheie. Căutarea binară. Căutarea după
metoda lui Fibonacci. Căutarea prin interpolare. Tabele ordonate după frecvenţa
de adresare la înregistrări tabelare.
4. Tabele cu adresarea directă. Funcţia de repartizare. Tabele de repartizare.
Coliziuni. Rezolvarea coliziunilor. Examinarea lineară. Tabele cu înlănţuirea
externă. Tabele cu înlănţuirea internă.
5. Tehnici de sortare. Noţiunea de sortare şi tipuri de sortare. Sortarea bazată pe
comparaţii, aprecierea algoritmilor de sortare. Algoritmi de sortare prin
interschimbare. Metoda bulelor, sortarea bazată pe metoda „Divide et Impera”
(sortare rapidă - quicksort). Aprecierea complexităţii. Îmbunătăţirile algoritmului
de sortare rapidă.
6. Algoritmi de sortare prin inserţie. Inserţia simplă recursivă, inserţia simplă
iterativă. Sortarea prin metoda lui Shell. Algoritmi de sortare prin interclasare
(mergesort). Aprecierea complexităţii.
Unităţi de conţinut
7. Algoritmi de sortare prin selecţie. Selecţia simplă. Selecţia sistematică
(piramidală, arborescentă - heapsort). Aprecierea complexităţii.
8. Structuri dinamice de date (arbori binari, liste, stive, cozi). Arbori
binari. Crearea arborilor. Accesul la elementele unui arbore. Parcurgerea
arborilor binari. Arbori binari plini. Arbori binari de căutare.
9. Liste simplu înlănţuite. Liste înlănţuite ciclic. Liste dublu înlănţuite.
Liste dublu înlănţuite ciclic.
10. Stive. Stive prin buffer de lungime fixă. Stive prin liste simplu
înlănţuite. Realizarea algoritmului de sortare rapidă prin utilizarea stivei.
11. Cozi. Cozi prin buffer ciclic. Cozi prin liste simplu înlănţuite.
12. Matrici dreptunghiulare. Reprezentarea matricelor în MO.
Reprezentarea „pe linii”, reprezentarea „pe coloane”. Accesarea
elementelor.
13. Accelerarea accesului la elementele matricei. Vectori definitori.
14. Vectori lui Iliffe. Exemplu de clasă generică dotată cu vectori lui Iliffe.
4 lucrări de laborator:
• 1. Metode de căutare în tabele
• 2. Metode de sortare
• 3. Structuri dinamice de date
• 4. Metode de acces la elementele unui masiv
5
Tipuri de date
Tip de date este un set de valori valide pe care un obiect le poate accepta,
precum şi un set de operaţii valide care se aplică la obiecte. În sensul aplicativ,
tipul depinde şi de prezentarea internă a informaţiilor.
Astfel, date de diferite tipuri sunt stocate şi prelucrate în moduri diferite.
Tipul de date defineşte:
reprezentarea internă a datelor în memoria calculatorului;
✓Volumul de memorie alocată datelor;
✓un set (interval) de valori care pot lua valori de acest tip;
✓operaţiile şi funcţiile care pot fi aplicate datelor de acest tip.
În baza acestor caracteristici, este necesar să se determine tipul fiecărei valori
utilizate în program pentru a reprezenta obiectele. O descriere obligatorie a
tipului permite compilatorului să verifice valabilitatea diferitelor construcţii în
program.
Succesiunea instrucţiunilor la nivel de cod maşină construită de compilator
depinde de alegerea tipului pentru valorile utilizate.
6
Tipuri abstracte de date
Tipul abstract de date— Acesta este un tip de date care oferă un set de
funcţii pentru lucrul cu elemente de acest tip, precum şi posibilitatea de a crea
elemente de acest tip utilizând funcţii speciale.
7
Structura abstractă de date
Definiţie Prin structura abstractă de date (SAD), sau pur şi simplu
structura de date (SD), vom înţelege o totalitate de reguli şi restricţii ce
reflectă legăturile existente între părţile separate de date şi prin care
părţile acestea se unesc într-o unitate întreagă.
Definiţie Prin structură de date dinamică vom înţelege aşa SD, la care în
procesul de lucru se schimbă atât informaţii ce se conţin în elementele
de date, cât şi numărul de elemente (componenţa cantitativă).
Exemplu: Liste înlănţuite de diferite tipuri, stive, cozi, arbori binari.
Clasificarea tipurilor de date în C ++
• Limbajele de programare moderne, de regulă, conţin un set de tipuri simple de date
care sunt încorporate în limbajele de programare şi mijloacele pentru crearea
tipurilor derivate.
Limbajele de programare orientate pe obiecte ne permit să definim tipurile de clase.
Implementarea tipurilor de date simple reprezintă modalitatea de a reprezenta valori de
acest tip în computer şi existenţa setului de operaţii acceptate pentru acel tip.
• Tipul de date determină volumul memoriei alocate unei variabile de acest tip atunci
când este creată. Limbajul de programare C ++ acceptă următoarele tipuri de date
(Figura 1 ).
• Tipuri de bază. Tipurile de bază sunt predefinite de standardul limbajului, sunt
indicate de cuvinte cheie rezervate şi sunt caracterizate printr-o singură valoare.
Ele nu trebuie să fie definite şi nu pot fi descompuse în componente mai simple,
fără a pierde esenţa datelor. Tipurile de obiecte de bază oferă baza pentru
construirea unor tipuri mai complexe.
• Tipuri derivate. Tipurile derivate sunt definite de utilizator, iar variabilele acestor
tipuri sunt create folosind atât tipurile de bază, cât şi tipurile de clase.
9
Clasificarea tipurilor de date
Tipuri de date
Figura 1
Structura de date
Structura de date este o unitate software care permite să
stocheze şi să proceseze o mulţime de date similare de acelaşi tip
şi/sau date cu o legătură logică în tehnologia de calcul.
• Pentru a adăuga, căuta, edita şi şterge datele, o structură de
date oferă un anumit set de funcţii care formează interfaţa sa.
• Structura de date este adesea o implementare a unui tip abstract
de date.
11
Structura de date – tablou de date (array)
Cea mai populară structură de date este tabloul în care accesarea
elementelor se face direct prin numărul său de ordine.
Cuvântul “tablou /array” este utilizat în diferite contexte:
• Ca tip de date abstract, adică un set de elemente cu operaţiile:
- obţinerea elementului cu numărul N,
- scrierea unui element cu numărul N,
• Ca o structură fizică implementată sub formă de zona de
memorie continuă.
Caracteristicile pozitive ale tabloului:
• Accesarea oricărui element în interval constant de timp,
• Memoria se consumă doar pentru date.
12
Tipuri de structuri de date în programare
• Variabile simple
• Tablouri /array
• Şiruri de caractere
• Înregistrări
• Liste
• Cozi
• Stive
• Grafuri
• Arbori
• Tabele
Tipuri de structuri de date în programare
21
Tipurile de Tabele
• Tabele neordonate
Elementele unei astfel de tabel nu sunt ordonate de valoarea cheii.
Pentru a căuta un element cu o cheie dată, folosim algoritmul de căutare
secvenţială.
• Tabele ordonate
Într-un astfel de tabel, toate elementele sunt ordonate în ordine crescătoare
a valorii cheii. Pentru a căuta un element cu o cheie dată în tabelele
ordonate, se utilizează algoritmii căutării secvenţiale, binare, prin
interpolare şi după metoda lui Fibonacci. După operaţia de inserare a
elementelor, elementele tabelului trebuie să rămână ordonate. Deci
înainte de efectuarea operaţiei de inserare, trebuie de găsit elementul
după care trebuie să adăugăm noul element.
Tabelele Hash — tabelul Hash este un tabel în care poziţia adresei unui
element este determinată prin utilizarea unei funcţii H (funcţie Hash),
argumentul căruia este valoarea cheii elementului.
Tabele neordonate
• Tabelul neordonat– este un tabel ale cărui elemente sunt
aranjate în ordinea în care sunt incluse în tabel.
23
Tabelul neordonat
• Acesta este cel mai simplu mod de organizare a tabelelor.
Elementele sunt amplasate consecutiv unul după altul, fără
spaţii. Procesul de căutare a elementului dorit este foarte
simplu - căutarea secvenţială a elementelor din tabel pornind
de la primul element. În acest caz, este analizat câmpul cheie
şi, în cazul în care condiţia de căutare este îndeplinită, este
localizat elementul dorit.
24
Operaţii logice asupra tabelelor. Căutarea
25
Căutarea secvenţială sau liniară
26
Problema de căutare
• Problema de căutare poate fi formulată după cum urmează: să se
găsească unul sau mai multe elemente din mulţimea dată; este
important ca elementele căutate să posede o anumită proprietate.
Această proprietatea poate fi absolută sau relativă.
• Proprietatea relativă caracterizează elementul în raport cu alte
elemente: de exemplu, elementul minim din mulţimea de numere.
• Un exemplu al sarcinii de a căutare a unui element cu proprietate
absolută: să se găsească elementul cu nr. 13 într-o mulţime finită
de elemente indexate, dacă aşa element există.
27
Problema de căutare
30
Căutarea secvenţială
• Analiza celui mai rău caz. Pentru Algoritmul Căutării Secvenţiale
există două cazuri cele mai grave. În primul caz, elementul căutat
este ultimul din listă. În al doilea caz – elementul nu este prezent în
listă. În ambele cazuri, algoritmul efectuează n comparaţii, unde n
este numărul elementelor din listă.
• Analiza cazului mediu. Valoarea căutată poate fi una dintre
poziţiile existente. Presupunem că toate aceste poziţii sunt
echiprobabile, adică probabilitatea întâlnirii fiecăreia dintre ele este
egală. Prin urmare, pentru a găsi elementul A[i], sunt necesare i
comparaţii. Ca urmare, pentru complexitatea în cazul mediu se
obţine egalitatea:
31
Concluzii
• De obicei, căutarea liniară este foarte uşor de implementat şi se
aplică dacă lista conţine puţine elemente sau cazul unei singure
căutări într-o listă neordonată.
32
Lucrarea de laborator nr.1
„Metode de căutare în tabele”
Termen 3 săptămâni
Să se creeze un fişier textual care conţine cel puţin 50 de
înregistrări, cu cel puţin 5 câmpuri şi are cel puţin 2 tipuri de date,
iar câmpul cheie trebuie să fie unic şi neordonat. Tematica structurii
de date se stabileşte împreună cu profesorul la lecţiile de laborator.
Să fie realizat un program în C++, în care sunt implementate cel
puţin două metode de căutare în tabele ordonate şi neordonate
după câmpul cheie din fişierul textual creat anterior. Pentru fiecare
metodă de căutare de analizat lungimea medie teoretică şi lungimea
practică de căutare.
De descris algoritmul metodelor de căutare pe paşi.
1 Metoda secvenţială de căutare
3 Metoda de căutarea în tabele neordonate structurate arborescent
2 Metoda binară de căutare
3 Metoda de căutare în tabele ordonate
Un referat la tema „Metode şi procedee de căutare”, prezentat în
1
faţa colegilor