Pe parcursul semestrului, vă poate fi util să știți cum se folosește un debugger pentru a găsi probleme într-un mod rapid. Vă recomandăm articolul PC@Debugging pentru a vă reaminti de cum folosim GDB atât din CLI cât și prin intermediul unui IDE.
Să se afle numărul de elemente distincte dintr-un vector.
Soluția optimă pentru această problemă folosește un Set în care sunt introduse elementele din vector unul câte unul. Întrucat set-ul va conține numai elemente distincte, răspunsul va fi numărul de elemente din set la finalul parcurgerii vectorului. Complexitatea temporală a algoritmului este O(N), inserarea și căutarea în Set fiind în O(1) amortizat, iar parcurgerea vectorului fiind în O(N). Complexitatea spațială este tot O(N), pentru că în cazul cel mai defavorabil vectorul va conține numai elemente distincte, iar set-ul va ajunge să conțină toate elementele vectorului. Totuși, pentru vectori mari cu multe duplicate, importanța set-ului în soluție este evidentă.
{2 4 5 4 2 1 4}
, avem elementele distincte {2 4 5 1}
, în numar de 4
.
Asupra unui șir de numere se pot aplica două tipuri de operații:
1. Update x: Adaugă numărul x în șir.
2. Query y: Returnează cel mai mic număr din șir care este mai mare decat numărul y.
Dându-se o serie de operații Update
și Query
asupra unui șir inițial vid, să se returneze o listă cu răspunsurile pentru operațiile de Query
. Se garantează că va exista un răspuns valid pentru fiecare operație Query
.
Update 2; Update 5; Update 7; Query 1; Query 5; Update 10; Query 3; Update 4; Query 3
, rezultatele operațiilor de Query
vor fi, în ordine: 2, 7, 5, 4
.
Dându-se N vectori ce conțin numere întregi sortate crescător, să se afișeze vectorul sortat crescător obținut prin interclasarea vectorilor inițiali. Hint: În vectorul final, elementele din același vector inițial trebuie să își păstreze ordinea relativă.
A = {5, 14, 25, 77}, B = {3, 8, 9}, C = {10, 10}, D = {2, 20, 30}
, vectorul sortat crescător obținut prin interclasare este {2, 3, 5, 8, 9, 10, 10, 14, 20, 25, 30, 77}
.
Soluția constă în crearea unui min-heap (priority queue) de dimensiune N, unde la început vom adăuga perechi formate din primul element din fiecare vector, și numarul vectorului din care l-am extras. Apoi, atata timp cât mai avem elemente in heap, vom extrage minimul din acesta, vom adăuga valoarea în vectorul rezultat și vom trece la următorul element din vectorul în care se afla elementul scos. Apoi, vom insera din acel vector următorul element în heap, împreuna cu indicele vectorului din care e selectat.
Complexitate: Fie numărul total de elemente din cei N vectori egal cu K. Pentru că în min-heap vom avea maxim N elemente simultan și vom adăuga toate elementele în heap, pe rând, complexitatea este O(KlogN). O abordare mai simplă, în care copiam toți vectorii inițiali într-un alt vector, pe care apoi îl sortăm, ar fi avut complexitatea (KlogK). Totuși, K este mult mai mare decât N, astfel că soluția optimă este cea cu heap-ul.
Se dorește generarea tuturor permutărilor numerelor de la 1 la N, în ordine lexicografică, unde N este variabil. Hint: numărul soluțiilor este N!
.
Problema este o aplicație clasică a metodei backtracking. În cadrul rezolvării se menține un vector cu soluția parțială, iar când se aleg valorile pentru toate cele N variabile, soluția este afișată. Pentru că în cadrul permutării trebuie sa existe numai numere distincte, se menține un vector pentru a marca numerele alese deja în soluția parțială.
Sursa furnizată ar trebui să rezolve problema, însă are două buguri. Pentru a rezolva exercițiul, găsiți bugurile și corectați-le.
N = 3
, avem următoarele 6 permutări în ordine lexicografică: 1 2 3, 1 3 2, 2 1 3, 2 3 1, 3 1 2, 3 2 1
.
Dându-se un vector de N elemente, se dorește să se afle dacă există duplicate aflate la distanța maxim K. Două elemente se află la distanța maxim K dacă ele se află la pozițiile i și j, iar |i - j| ≤ K
.
{1, 4, 1, 6, 4, 6, 1}
și K = 2
, avem duplicatele (1,1) (pe pozițiile 0 și 2) și (6, 6) (la pozițiile 3 și 5)
.
Hint: Complexitate dorită O(N). Extra hint: Gandiți-vă cum puteți extinde problema aflării duplicatelor dintr-un vector.
Dându-se un vector de N elemente, se dorește să se afle dacă există duplicate fuzzy aflate la distanța maxim K. Două elemente se află la distanța maxim K dacă ele se află la pozițiile i și j, iar |i - j| ≤ K
. Două elemente A și B sunt duplicate fuzzy dacă |A - B| < 3.
{1, 4, 1, 6, 4, 6, 1}
și K = 2
, avem duplicatele fuzzy (1,1) (pe pozițiile 0 și 2), (6, 4) (pe pozițiile 3 și 4), (4, 6) (pe pozițiile 3 și 4) și (6, 6) (la pozițiile 3 și 5)
.
Hint: Complexitate dorită O(N). Extra hint: Folosiți ideea de bază din Bucket Sort :).
Pentru a îmbunatăți crash course-ul, ne-ar fi de ajutor feedback-ul vostru. Mulțumim! Trimite feedback