Sunteți pe pagina 1din 8

Laborator 0: Introducere i Relaxare

De ce Proiectarea Algoritmilor?
Rspunsul este simplu: complexitatea algoritmilor, plcerea de a explora alternative, de a le compara i n final de a rezolva optim problemele. Totodat posibilitatea de a fi creativ i de ce nu chiar inovativ, capacitatea de a generaliza anumite aspecte i de soluiona probleme din viaa de zi cu zi sunt doar cteva dintre aspectele pe care le vom explora mpreun. Nu ne rezumm la calcul computaional; algoritmii pot fi aplicai n orice circumstane i fundamenteaz o serie de decizii care guverneaz multiple aspecte din realitatea nconjurtoare. Absolut toi algoritmii analizai se regsesc n viaa de zi cu zi, ntr-adevr cu frecvene diferite, iar faptul c noi putem nelege ce se ntmpl n profunzime ne poate oferi acel je ne sais qois care s ne diferenieze. Astfel, avem o plaj larg din care s alegem: n cazul reelisticii: algoritmii de rutare, politicile de load-balancing si flux maxim; n sisteme de operare: scheduling, caching; grafica cu prelucrarea imaginilor, determinarea contururilor, iluminare i texturare; baze de date cu indeci, operatorul select n sine; componente hardware pornind de la banalul incrementator pe bii i pn la procesoarele DSP pentru prelucrarea semnalelor; inteligena artificial cu tot ce nseamn prelucrarea limbajului natural, analiza reelelor sociale, analiz semantic, sisteme bazate pe reguli. Pe scurt, sky is the limit! n alt ordine de idei, fr a ne auto-flata, dac acum nu incercam s nelegem si stpnim algoritmii i posibilitile oferite, atunci cnd? Astfel accentul este pus pe partea formal, importana i utilitile algoritmilor, iar implementrile propriu-zise pot fi considerate o validare. Ultimul aspect cu adevrat important este c algoritmii stau la baza a cam tot ce nseamn Computer Science, iar proiectarea eficient a acestora face diferena.

Pentru cine?
n primul rnd pentru tine i sperm s contientizezi acest lucru: totul se rezum la a-i construi o baz de cunotine util n viaa, indiferent de specializarea pe care o vei urma. Oricum nu exist subdomeniu din Computer Science n care s nu apelezi la algoritmi, orict de simpli sau compleci. Pe de alt parte, numrul de persoane care pot spune c neleg algoritmii, tiu s-i aplice i s determine soluia optim este restrns, crend astfel o comunitate activ si dinamic.

Ce vom face?
Vom aprofunda elementele fundamentale necesare rezolvrii fiecrei clase de probleme analizate, prezentnd mai multi algoritmi de rezolvare pentru fiecare problem studiat i

evidenind algoritmii optimi. Pornind de la aceste elemente, vom accentua punctele de interes identificate, descoperind abloane de rezolvare i modaliti de constuire a soluiilor pentru o problem. Cteva din aspectele atinse includ:

Divide et Impera, Greedy i programare dinamic; Parcurgeri pe grafuri (BFS, DFS) i sortare topologic; Cutri in spaiul strilor (best-first, A*); Alte aplicaii DFS (componente tare conexe, puncte de articulaie, puni); Backtracking i optimizri (prospective i retroactive); Drumuri minime i arbori minimi de acoperire; Algoritmi Minimax; Fluxuri maxime; Algoritmi aleatori.

Ce nu vom face?
Copiat teme, laboratoare. Pentru a continua ideea simpl i pentru a accentua ntrebarea pe care trebuie s ne-o punem ct mai des - de ce? -, formulm un rspuns la fel de simplu i imediat: fiindc este greit. Analogia cea mai simpl pe care o putem face este cu viaa la nivelul creia ntotdeauna exist un echilibru: ce faci ntotdeauna i se ntoarce, cu diverse ponderi, n unele cazuri putnd fi chiar nzecit. i dac la o materie care i stimuleaz creativitatea, inovaia, te pune la ncercare i care fundamenteaz abordrile din Computer Science apelezi la astfel de metode, sincer trebuie s i pui ntrebarea: eu ce caut la aceast facultate? Din punctul nostru de vedere nu copiezi din mndrie personal, la urma urmei este bine s fi deasupra celora care apeleaz la astfel de metode. n plus s nu uitm de satisfacia personal ulterioar. i ce dac nu sunt prini? Garantm c tot ei au numai de pierdut, att din prisma aspectelor nvate, ct i a implicaiilor ulterioare. Alegerea acestei facultati a fost rezultatul unei documentri minuioase care a dus la identificarea acesteia cu idealurile personale ale fiecruia dintre voi. Rolul pe care i-l asum un ndrumator este doar de a materializa acest vis i de a v ajuta n atingerea elurilor propuse la intrarea n facultate. Metodele de copiat reprezint mijloace care altereaz atingerea obiectivelor proprii i a perspectivei despre nivelul si capacitaile personale. Totodat aceastea nu pot s influeneze perspectiva posibililor angajatori, n momentul trecerii n practic a cunotinelor acumulate n perioada facultii. Astfel, singurul rezultat este pe termen scurt i reflect zicala i-ai furat singur caciula. n plus, n concordan cu principiul carot and stick va exista o verificare minuioas mpotriva copierii.

Pe scurt, la prima abatere -10p pe tema respectiv (punctajul maxim ce se poate obine pe tem), la a doua restan. Regulile sunt foarte simple.

Evaluarea Temelor
Notarea temelor va avea la baz urmtoarele criterii i punctaje aferente:

5 puncte dac se respect cerinele temei, adic compilare i execuie fr erori astfel nct s se obin rezultatele cerute; 3 puncte pentru o implementare eficient; 1 punct pentru comentariile din fiierele surs, menionarea bibliografiei n README (dac este cazul), respectiv coninutul propriu-zis al fiierului README; 1 punct pentru Coding Style.

Pentru a asigura o evaluare uniform a temelor, va exista o singur persoan care este responsabil de corectarea unei teme la nivelul ntregii serii. Toate temele vor fi corectate folosind acelai set de teste. Pentru a veni in sprijinul vostru i pentru a testa corectitudinea i eficiena implementrii temelor, fiecare enun va avea un link ctre o pagin de pe infoarena unde se pot testa rezolvrile realizate n C/C++. Temele rezolvate n Java (sau alte limbaje de programare, dar cu acordul explicit al responsabilului de tem) nu vor putea fi testate folosind infoarena. Pentru aceste teme, avei posibilitatea s folosii direct vmchecker, putnd astfel s beneficiai de feedback nainte de trimiterea rezolvrii temei. Toate temele vor fi testate automat folosind vmchecker, dar i prin verificarea codului i citirea ReadMe-ului.

Coding Style
Stilul de redactare al programelor are impact major asupra celor care parcurg respectivul cod. Dac pentru compilator nu este nicio diferen, o indentare corespunztoare ne ajut oferind:

claritate; concizie; vitez mult mai mare de regsire i reamintire a anumitor aspecte.

Totodat, stilul de codare ine i de gradul de profesionalism care se dorete a fi exprimat, comentariile marcnd:

coeziunea ideilor; structurarea acestora; claritatea; ordonarea acestora din perspectiva organizrii personale.

De asemenea, comentariile ar trebui s exprime pe scurt detaliile de implementare ntr-un limbaj tehnic, ghidnd astfel programatorul atunci cnd citete pentru prima oar respectivul cod. Desigur exist particulariti specifice fiecrui limbaj de programare, precum i individuale din prisma preferinelor personale. Ulterior pot aprea constrngeri generate de specificul echipei sau companiei din care vei face parte, dar exist un set general de reguli care merit urmat (exemplele au fost preluate de pe Wikipedia):

Prezentare general
Formatare (indentare) general
if (hours < 24 && minutes < 60 && seconds < 60) { return 1; } else { return 0; }

Spaii n cadrul structurilor i ntre operatori


int i; for (i = 0; i < 10; ++i) { printf("%d", i * i + i); }

Tab-uri pentru aliniere


int double ix; sum; // Index // Accumulator pentru suma

Nume adecvate i sugestive pentru variabile/funcii


int correctFormat (int hours, int minutes, int seconds) { if (hours < 24 && minutes < 60 && seconds < 60) { return 1; } else { return 0; } }

n loc de:
int correctFormat (int a, int b, int c) { if (a < 24 && b < 60 && c < 60) { return 1; } else { return 0; } }

Valori boolene n structuri de decizie

Doar pentru efect stilistic ntruct codul generat alternativ este oricum optimizat de compilator.
return (hours < 24) && (minutes < 60) && (seconds < 60);

Comparaii de tip Left-hand:


if ( a = 42 ) { ... } // Eroare inadvertenta care poate aparea si e dificil de identificat if ( 42 = a ) { ... } // Eroare de compilare

Cicluri i structuri de control Utilizarea acoladelor i indentarea corespunztoare nivelului de imbricare (evitarea problemelor care pot aprea de exemplu n Python datorate indetrii greite):
for (int i = 0; i < 5; i++) { printf("%d", i * 2); } printf("Ended loop");

Liste elementele sunt plasate pe linii diferite:


const char *zile[] = { "luni", "marti", "miercuri", "joi", "vineri", "sambata", "duminica" };

Caracteristici specifice fiecrui limbaj se regsesc n seciunea de referine. Alte aspecte care trebuie luate n vedere la scrierea elegant a codului:

modularitatea programelor (dimensiune recomandat este de 20 de linii per funcie/procedur), totodat asigurnd creterea lizibilitii codului, a posibilitilor de reutilizare; se dorete de asemenea obinerea unei cuplri strnse n cadrul aceluiai modul, precum o cuplare ct mai slab ntre module diferite din perspectiva proiectrii arhitecturale; folosirea de constante/variabile n loc de valori hard-coded; reutilizarea codului, evitnd astfel situaii de repetare de tip copy paste a unor seciuni de cod, care n urma unor modificri ulterioare pot duce la anumite situaii dificile de tip debugging; documentarea codului, comentariile reprezentnd un aspect important al scrierii elegante a codului.

Accentul pe Algoritmi
Dup cum reiese i din denumirea materiei, accentul va fi pus pe partea formal i nelegerea efectiv a algoritmilor. Astfel, la nivelul implementrii, limbajul ales este la latitudinea fiecruia. Din perspectiva uurinei de scriere, a structurilor de date disponibile i a sintaxei se recomand Java. Din perspectiva performanelor obinute, recomandrile nclin spre C/C++, cu amendamentul c pentru structuri de baz s fie integrat STL. Mai multe detalii putei gsi n anexa acestui laborator.

Aplicaii de Laborator
Socializare
Obiectiv pentru studeni: cunoaterea asistentului i angajarea ntr-o discuie liber. Obiectiv pentru asisteni: familiarizarea cu studenii. Sugestii: 1. Asistentul se prezint n cteva minute, ntr-o manier pe care dorete s o urmeze i studenii (liceu terminat, specializare la facultate, domenii de interes in Computer Science, hobby-uri, diverse realizri). 2. Prezentarea fiecrui student folosind o abordare similar. Eventual se poate lucra i n echipe de 2 persoane n cadrul crora fiecare student l prezint pe cellalt dup principiul vorbesc cu tine i nu despre tine; 3 categorii clare trebuie s reias din fiecare prezentare: latura personal (afiniti, caracteristici individuale), profesional (reuite personale) i un secret la latitudinea fiecruia (principiul c nimeni din camer nu trebuie s tie acel aspect); 3. ntrebri interesante pentru studeni: dac au fost la concursuri n liceu, dac folosesc Infoarena sau Topcoder, dac au citit CLRS mcar n parte, ce ateptri au de la PA, ce (nu) le-a plcut pn acum n facultate, unde vor s ajung dup facultate, etc. 4. Opional: Determinarea pentru fiecare persoan a rspunsului la ntrebarea: De ce m bucur eu astzi? (3 motive), clasificarea n funcie de specific (eveniment, aspect social, personal) i temporal (trecut, prezent, viitor); ntrebarea i mai puternic pe care trebuie s ne-o punem apoi de ce se bucur ceilali cnd ne vd? 5. Opional: Argumentarea influenei personale, necesitatea unei abordri pozitive n tot ceea ce facem; orice gest, atitudine se reflect n exterior. 6. Opional: Viziunile determin comportamentul, importana inovaiei i ncurajarea creativitii. Aici exerciiul pentru argumentare este simplu. Avem 2 puncte A i B pe care le stabilii aleator n camer. Ct de greu este s parcurgem distana? Acum avem o brn la nivelul solului. Trebuie mers n echilibru, dar nimic nu ni se poate ntmpla. n final, A i B delimiteaz spaiul dintre 2 blocuri (o prpastie), nu poate fi ocolit i nu exist sanse de supravieuire n cazul nefecirit n care te dezechilibrezi? Ce se schimb

ntre scenarii i ce te-ar face s traversezi? O persoan drag, o sum considerabil de bani, nici btut nu ai trece? Totui dac te uii exclusiv n fa vezi exact acelai lucru, totul ine de percepia i viziunea fiecruia. Acum pe lng motiv care implic clar motivaia ce te face totui s traversezi? Peste 90%, n general rspund voina. Adevrat, te poate duce sus i fr ea nu poi face multe. Dar i mai important, pentru a ajunge n vrf ai nevoie de creativitate, inovaie. Iar domeniul algoritmicii este clar un domeniu cu un potenial nelimitat n care se aplic perfect sintagma only the sky is the limit.

Prezentare General
Prezentarea ateptrilor i a regulamentului, al modului de desfurare al laboratoarelor.

Probleme
1. [Coding Style] Fr a introduce urmtorul cod, spunei ce rezult n urma rulrii lui: 1. Functia 1:
2. void a(int v[],int n){int i,m,l; 3. do{m=1;for(l=0;l<n-1;l++)if(v[l]>v[l+1]){i=v[l]; v[l]=v[l+1];v[l+1]=i;m=0;}}while(!m);}

4. Functia 2:
5. void f(int v[],int o,int p) 6. {int c,q,w,b,a; 7. if(o<p){b=(o+p)/2; 8. a=v[o];v[o]=v[b];v[b]=a; 9. c=v[o];q=o+1;w=p; 10. while(q<=w){while((q<=p)&&(v[q]<=c))q++; 11. while((w>=o)&&(v[w]>c))w--; 12. if(q<w){a=v[q];v[q]=v[w];v[w]=a;}} 13. a=v[o];v[o]=v[w];v[w]=a; 14. f(v,o,w-1); f(v,w+1,p);}}

2. [STL] Se dau dou iruri. S se elimine toate apariiile celui de-al doilea ir din primul. Se va afia coninutul textului dup fiecare tergere. Folosii documentaia clasei std::string. 3. [STL] Se d un vector de n elemente. S se sorteze cresctor cele n numere, folosind un minheap. Folosii documentaia clasei std::priority_queue. 4. [STL] Se dau n perechi de numere, reprezentnd puncte n spaiu. S se sorteze punctele (dup abscis; la abscis egala, dupa ordonat). Folosii documentaia pentru funcia std::sort. Dac vei folosi pentru reprezentarea punctelor de coordonate clasa
std::pair<float,float>

, atunci nu va mai fi nevoie s definii operatorul de comparaie. De asemenea, v recomand pentru motive de claritate a codului s redenumii tipul n ceva mai sugestiv cu ajutorul lui typedef astfel:
typedef std::pair<float,float> Point;

Anexa
Un scurt tutorial de C++ scris pentru studenii de la PA se gsete aici. V recomandm s parcurgei mai ales capitolele introductive i cele referitoare la STL pentru a dobndi rapiditate n implementare i uurina de a manipula structurile de date de baza cerute de algoritmi i implementate n limbaj: vectori, liste, stive, cozi, heap-uri, map-uri, set-uri, etc.

Referine
1. 2. 3. 4. 5. 6. 7. 8. 9. Code Conventions for the Java Programming Language Google C++ Style Guide C Coding Standard C++ Layout And Comments Brad Abrams, Design Guidelines, Managed code and the .NET Framework Mozilla Coding Style Guide PHP::PEAR Coding Standards infoarena VMChecker

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