Aici sunt prezentate diferențele dintre versiunile selectate și versiunea curentă a paginii.
Ambele părți revizuirea anterioară Versiuni anterioare Urmatoarea versiune | Versiuni anterioare | ||
laboratoare:laborator-04 [2017/02/15 18:42] sebastian.cancel |
laboratoare:laborator-04 [2018/02/25 22:34] mihai.iacov |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | ====== Laborator 04: Introducere în teoria grafurilor | + | ====== Laborator 04: Stive & Cozi ====== |
\\ | \\ | ||
=====1 Obiectivele laboratorului===== | =====1 Obiectivele laboratorului===== | ||
- | *Definirea structurii | + | *Înțelegerea conceptului de funcționare si implementarea de stive și cozi. |
- | *Definirea structurii și elementelor unui graf orientat | + | *Implementarea unor funcții individuale de lucru cu acestea. |
+ | \\ | ||
+ | =====2 Ce este o stivă? | ||
+ | ====2.1 Definiție==== | ||
+ | O stivă reprezintă o listă cu structuri de date de tipul: Last-In-First-Out (LIFO).\\ | ||
+ | Un exemplu comun ar fi un teanc de cărți: tot punem cărți pe o masă, dar în momentul când vrem să le ridicăm | ||
+ | începem cu ultima, pusă deasupra teancului. | ||
+ | {{ : | ||
- | =====2 Grafuri neorientate===== | + | ====2.2 Operații cu stive==== |
- | ====2.1 Definiție==== | + | |
- | Un **graf neorientat** este o pereche ordonată de multimi(X,U),unde: | + | Definim structura astfel: |
- | *X este o mulțime finită și nevidă de elemente numite | + | <file cpp> |
- | *U este o mulțime de perechi neordonate | + | struct stack{ |
+ | int s[size]; | ||
+ | int top = -1; | ||
+ | } st; | ||
+ | </ | ||
+ | |||
+ | * **Verificăm dacă stiva e plină sau goală** | ||
+ | <file cpp> | ||
+ | int st_full(){ //int st_empty{ | ||
+ | | ||
+ | return 1; | ||
+ | | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | * **Adăugarea** | ||
+ | <file cpp> | ||
+ | void push(int item){ | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | * **Ștergerea** | ||
+ | <file cpp> | ||
+ | int pop(){ | ||
+ | int item; | ||
+ | | ||
+ | return -1; //cu valoarea -1 | ||
+ | item = st.s[st.top]; | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | **// | ||
+ | 1.Când introducem elemente într-o stivă, | ||
+ | 2.Când ștergem un element, | ||
+ | 3.O stivă poate fi implementată cu ajutorul unui **vector** sau cu **liste înlănțuite**.\\ | ||
+ | |||
+ | =====3 Ce este o coadă? | ||
+ | |||
+ | ====3.1 Definiție ==== | ||
+ | O coadă este o structură de date ce modelează un buffer de tip First-In-First-Out (FIFO).Astfel, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ====3.2 Operații cu cozi==== | ||
+ | Definim structura astfel: | ||
+ | <file cpp> | ||
+ | struct queue{ | ||
+ | int queue[size]; | ||
+ | int rear = -1; | ||
+ | int front = 0; | ||
+ | }Q; | ||
+ | </ | ||
+ | |||
+ | * **IsEmpty** - întoarce 0 dacă coada este goală;1 dacă are cel puțin un element. | ||
+ | <file cpp> | ||
+ | int Qempty(){ | ||
+ | | ||
+ | return 1; | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | * **Enqueue / Adăugarea** - adaugă un element (entitate) în coadă.Adăugarea se poate face doar la sfârșitul cozii. | ||
+ | <file cpp> | ||
+ | void Qinsert(int item){ | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | * **Dequeue/ | ||
+ | <file cpp> | ||
+ | int Qdelete(){ | ||
+ | int item; | ||
+ | if( Qempty() ) //in acest caz, alegem o valoare de return | ||
+ | return -1; // ce NU poate fi confundata cu un element | ||
+ | // | ||
+ | else { | ||
+ | item = Q.queue[Q.front]; | ||
+ | Q.front ++; | ||
+ | return item; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====3.3 Clasificare==== | ||
+ | |||
+ | * **Dequeue** - (sau coadă cu dublu acces) | ||
+ | De cele mai multe ori sunt implementate folosind liste dublu înlănțuite.\\ \\ | ||
+ | Dintr-un anume punct de vedere, se poate considera că atât stiva cât si coada clasică sunt specializări ale tipului abstract dequeue întrucât ambele se pot implementa folosind dequeue (și restrângând operațiile ce se realizează asupra sa).\\ | ||
+ | {{ : | ||
+ | }}* **Priority queue** - Coada prioritară reprezintă un tip de coadă în care fiecare element are asociată o anume prioritate.\\ | ||
+ | În aceste condiții, | ||
+ | * **Enqueue** - adaugă la coadă un element cu prioritatea specificată\\ | ||
+ | * **Dequeue** - extrage elementul cu cea mai mare prioritate\\ | ||
+ | | ||
+ | |||
+ | =====4 Exerciții propuse ===== | ||
+ | |||
+ | ==== 4.1 Exerciții clasice ==== | ||
+ | 1. **FIFO buffer** | ||
+ | O coadă | ||
+ | Un buffer FIFO stochează date pe principiul " | ||
+ | Datele sunt scrise in capul cozii și citite de la coadă.Dacă parcurgerea are loc de la coadă spre cap, | ||
+ | |||
+ | **Implementare generală**\\ | ||
+ | 1) Definite structură: | ||
+ | 2) Se realizează funcția de inițializare a cozii cu bufferul dat și marimea.\\ | ||
+ | 3) Se realizează funcția de citire a celor nbytes | ||
+ | 3.1 Pentru nbytes:se verifică dacă sunt date valabile (dacă coada e diferită de cap)\\ | ||
+ | 3.2 Daca da, se ia un byte din buffer și se incrementează coada.\\ | ||
+ | 3.3 Se verifica apoi dacă s-a terminat parcurgerea pentru a se reinițializa coada cu 0.\\ | ||
+ | 3.4 În cazul în care nu sunt date valabile se returnează nr. de bytes.\\ | ||
+ | 4) Se realizează funcția de scriere a celor nbytes din coadă.\\ | ||
+ | 4.1 Pentru nbytes: | ||
+ | //[Bonus]// Generarea in mod random a datelor de intrare și prelucrarea lor cu ajutorul funcțiilor de mai sus;astfel valorile folosite vor fi introduse de la tastatură | ||
+ | |||
+ | 2.Implementați pentru o structură de tip stivă funcţiile de inserare, extragere a unui nod, precum şi cele de afişare şi de semnalare a situaţiilor extreme (stivă goală au stivă plină). | ||
+ | |||
+ | ====4.2 Exercitii alternative - schelet de laborator==== | ||
+ | Pentru acest laborator puteți descărca scheletul de cod de [[http:// | ||
+ | |||
+ | Pentru acest laborator sunt două exerciții, primul cu stive și al doilea cu cozi. Fiecare are mai multe task-uri. Urmăriți cu atenție comentariile din fișierele sursă. | ||
+ | |||
+ | ===4.2.1 Linux=== | ||
+ | Puteti folosi utilitarul '' | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | <code bash> | ||
+ | student@sda-ab-vm: | ||
+ | --2017-03-02 20: | ||
+ | Resolving elf.cs.pub.ro (elf.cs.pub.ro)... 141.85.227.116 | ||
+ | Connecting to elf.cs.pub.ro (elf.cs.pub.ro)|141.85.227.116|: | ||
+ | HTTP request sent, awaiting response... 200 OK | ||
+ | Length: 2368 (2,3K) [application/ | ||
+ | Saving to: ‘lab1-skel.zip’ | ||
+ | |||
+ | lab1-skel.zip | ||
+ | |||
+ | 2017-03-02 20:45:56 (4,78 MB/s) - ‘lab1-skel.zip’ saved [2368/ | ||
+ | |||
+ | student@sda-ab-vm: | ||
+ | lab1-skel.zip | ||
+ | student@sda-ab-vm: | ||
+ | Archive: | ||
+ | | ||
+ | | ||
+ | inflating: lab2_stive-si-cozi/ | ||
+ | inflating: lab2_stive-si-cozi/ | ||
+ | | ||
+ | inflating: lab2_stive-si-cozi/ | ||
+ | inflating: lab2_stive-si-cozi/ | ||
+ | student@sda-ab-vm: | ||
+ | student@sda-ab-vm: | ||
+ | total 0 | ||
+ | drwxrwxrwx 1 student student 248 mar 5 15:57 1-stack | ||
+ | drwxrwxrwx 1 student student 248 mar 5 15:58 2-queue | ||
+ | |||
+ | student@sda-ab-vm: | ||
+ | student@sda-ab-vm: | ||
+ | student@sda-ab-vm: | ||
+ | </ | ||
+ | |||
+ | Pentru compilare folositi comanda '' | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | ===4.2.2 Linux + Github=== | ||
+ | [[https:// | ||
+ | |||
+ | Dacă sunteți familiari cu git puteți clona repo-ul local folosind comanda '' | ||
+ | ====4.3 Opţional - de interviu==== | ||
+ | |||
+ | 1. Implementaţi o stivă folosind două cozi. | ||
- | ====2.2 Structură==== | + | 2. Implementaţi o coadă folosind două stive.(utilizarea apelurilor recursive ale unor funcţii se contorizează ca folosirea unei stive) |
- | # | + | 3. Implementaţi |
- | Un graf are următoarele elemente: | + | 4. Se dă un vector cu n întregi și un număr k. Aflați valoarea maxima pentru fiecare grupare de k numere de pe poziții consecutive. |
- | * **Mulțimea nodurilor X** - Mulțimea tuturor nodurilor grafului | + | |
- | * **Multimea muchiilor U** - Mulțimea tuturor muchiilor grafului | + | |
- | * **Gradul nodului** - Suma muchiilor formate cu ajutorul nodului respectiv | + | |
- | * **Nod izolat** - Un nod ce nu formează nici-o muchie | + | |
- | * **Noduri terminale** - Un nod ce formează o singură muchie | + | |
- | * **Noduri adiacente** - Noduri intre care există o muchie | + | |
- | * **Nod si muchie incidente** - Nodul face parte dintr-o muchie | + | |
- | \\ | + | |
- | \\ | + | |
- | ====2.3 Reprezentare ==== | + | 5. Se dă un vector |
- | * **Matricea de adiacență** - este o matrice **a** cu **n** linii și **n** coloane,în care elementele **a[i,j]** se definesc astfel: | + | |
- | *a[i,j] = 1 ,dacă ∃ muchia [i,j] cu i≠j | + | |
- | | + | |
- | * **Lista vecinilor nodului x** - cuprinde toate nodurile care sunt extremități ale muchiilor ce trec prin nodul **x** | + | |
- | * **Vectorul | + | |
- | \\ | ||
- | * Un **graf parțial** este un graf obținut din graful inițial prin eliminarea uneia sau mai multor muchii | ||
- | * Un **subgraf** este un graf obținut din graful inițial prin eliminarea unui număr de noduri impreună cu muchiile formate cu acele noduri | ||
- | \\ |