Conceptul de algoritm - abordare modernă (I)

Dezvoltarea informaticii actuale se datorează cercetărilor, rezultatelor şi experienţelor din domeniile sistemelor de calcul, algoritmicii şi programării, dar mai ales a interdependenţei acestor domenii prin aşa-numita triadă "sistem de calcul - algoritmică - programare". La baza acestei interdependenţe se află conceptul de algoritm, concept care a construit pentru om o nouă filosofie: "gândirea algoritmică". Această gândire algoritmică a făcut posibilă apariţia şi dezvoltarea Tehnologiei Informaţiei (IT) care reprezintă de fapt implementarea filosofiei procesării, gestionării şi transmiterii informaţiilor.

În cele ce urmează vom realiza o abordare modernă a conceptului de algoritm şi vom evidenţia necesitatea eliminării abordărilor vechi care, din păcate, mai există în multe manuale adresate elevilor şi studenţilor.

Mulţi dintre autorii manualelor de informatică din ţara noastră greşesc şi dau o importanţă minoră conceptului de algoritm, atunci când consideră că "algoritmul este o noţiune primară".

Dezvoltarea unei gândiri algoritmice se poate realiza doar prin activităţi de instruire şi formare care să aibă la bază conceptul fundamental de algoritm într-o abordare modernă şi nu una învechită. Abordarea propusă va putea fi adaptată la orice nivel de instruire şi la orice arie curriculară.

Introducere

Întâmplător sau nu, deceniul 7 al secolului al XX-lea a fost unul al marilor schimbări în domeniul informaticii şi al sistemelor de calcul:

  • inventarea microprocesorului ("bijuteria de bază" a sistemelor de calcul actuale) ca urmare a rezultatelor din trei domenii fundamentale: sisteme, circuite integrate şi microprogramare; a urmat construirea şi răspândirea pe scara largă a sistemelor de calcul de tip PC (Personal Computer), impulsionarea dezvoltării reţelelor de calculatoare, precum şi apariţia şi dezvoltarea de noi sisteme de operare; performanţe sporite ale dispozitivelor de intrare / ieşire;
  • supremaţia şi răspândirea structurilor de control  în algoritmică şi programare; apariţia limbajului pseudocod pentru reprezentarea şi elaborarea algoritmilor; conceperea şi scrierea primelor limbaje de programare care implementează structurile de control, adaptarea continuă a limbajelor de programare prin implementarea structurilor de control, a structurilor de date, precum şi a facilităţilor programării orientate obiect (OOP - Object Oriented Programming);
  • succese spectaculoase în domeniul inteligenţei artificiale prin construirea primelor sisteme expert; conceperea şi scrierea primului limbaj de programare logică (limbajul Prolog) care oferă suportul programării declarative; dezvoltarea şi utilizarea largă a metodelor şi tehnicilor inteligenţei artificiale în rezolvarea câtorva dintre cele mai dificile probleme;
  • delimitarea problemelor rezolvate cu calculatorul (probleme decidabile) în două clase distincte: clasa problemelor rezolvate prin metode imperative (procedurale) şi clasa problemelor rezolvate prin metode declarative; delimitarea clasei problemelor nedecidabile; apariţia şi dezvoltarea tehnicilor pentru comunicarea şi căutarea la distanţă a informaţiilor.

Toate aceste aspecte au fost şi sunt într-o interdependenţă continuă ţinând seama de particularitatea informaticii care oferă sisteme de calcul performante şi produse software competitive în rezolvarea problemelor. Utilizarea eficientă a sistemelor de calcul şi a produselor software necesită o instruire continuă, atât pentru programatori, cât şi pentru utilizatori.

Dezvoltarea gândirii algoritmice trebuie luată în considerare ca obiectiv în instruire, atunci când se învaţă algoritmica (metode şi tehnici) dar şi când se învaţă programarea (utilizarea limbajelor de programare).

Practica instruirii elevilor şi studenţilor a demonstrat că învăţarea unui limbaj de programare este în general "mai uşoară" decât învăţarea elaborării algoritmilor (algoritmica). Acest lucru se poate justifica prin faptul că elaborarea unui algoritm este echivalentă cu implementarea (reprezentarea) raţionamentelor (proceselor demonstrative) deduse din metodele şi tehnicile utilizate în rezolvarea unei probleme.

Rezolvarea problemelor necesită nu numai cunoştinţe clare şi precise, dar şi capacitate de sinteză şi control şi mai ales capacitate de creaţie. Dacă vrem să facem o analogie, un programator poate fi "compozitorul" care realizează o "lucrare muzicală".

În toate etapele instruirii trebuie avută în vedere următoarea interdependenţă: "sistem de calcul - algoritmică - programare".

Succesele unui concurent la olimpiadele de informatică depind de cunoaşterea utilizării unui limbaj de programare modern, dar mai ales depind de "bogăţia" şi stăpânirea cunoştinţelor în elaborarea algoritmilor. Şi mai există încă ceva: experinţa acumulată în activitatea de rezolvare a problemelor prin formarea unei gândiri algoritmice solide şi consistente. Acelaşi lucru se poate afirma şi despre succesele unui programator care lucrează într-o firmă de software.

Complexitatea problemelor care necesită descrierea mai multor procese de calcul complexe a determinat folosirea noţiunii de algoritm în activitatea de rezolvare a problemelor. Multe procese naturale, multe activităţi umane, pot fi descrise într-o formă algoritmică prin definirea unor informaţii şi acţiuni clare şi precise, eliminându-se ambiguităţile în interpretare şi în operaţii. Algoritmizarea este o cerinţă fundamentală în rezolvarea oricărei probleme cu ajutorul calculatorului.

Experienţa a demonstrat că nu orice problemă poate fi rezolvată prin algoritmizarea rezolvării, adică prin descrierea unui algoritm de rezolvare. Aşa s-a delimitat clasa problemelor decidabile (o problemă este decidabilă dacă există un algoritm pentru rezolvarea ei) de clasa problemelor nedecidabile (o problemă este nedecidabilă dacă nu există un algoritm pentru rezolvarea ei).

Un algoritm implementează diverse metode şi tehnici de rezolvare care au fost descoperite sau definitivate întrun anumit moment în evoluţia ştiinţifică a domeniului respectiv.

Există algoritmi care urmează metode dezvoltate înainte de apariţia calculatoarelor, dar cele mai multe probleme cer abordări noi. Chiar dacă ne gândim numai la "problema celor patru culori", care a fost rezolvată (în anul 1977) doar prin utilizarea calculatorului şi prin utilizarea unei metode "noi" (metoda backtracking), facem dovada acestei afirmaţii.

Gândirea algoritmică

În etapa actuală de dezvoltare ştiinţifică şi tehnică, rezolvarea unei probleme dintr-un domeniu (informatică, matematică, fizică, chimie etc.) reprezintă o activitate de creaţie, un raţionament prin construirea, generarea, descrierea unui:

  • proces demonstrativ (demonstraţia) care să arate existenţa uneia sau mai multor soluţii şi / sau să determine efectiv soluţiile exacte;
  • proces computaţional (algoritmul) care să codifice un proces demonstrativ, o metodă sau o tehnică de rezolvare în scopul determinării (eventual aproximative) a soluţiilor exacte.

În general, în procesul (activitatea) de rezolvare a unei probleme dintr-un anumit domeniu (ştiinţific, economic, social etc.), este necesară evidenţierea ipotezei (condiţiile, stările iniţiale, parametri iniţiali) şi a concluziei (cerinţele, obiectivele, scopurile) din analiza şi studiul enunţului problemei.

Procesul de rezolvare (raţionamentul) constă în utilizarea selectivă a legilor, teoremelor, propoziţiilor etc. din domeniul problemei, pentru ca pornind de la ipoteză, prin aplicarea succesivă a legilor, teoremelor etc. să se obţină concluzia problemei.

Legătura dintre ipoteză, concluzie şi procesul de rezolvare (raţionamentul) determină o structură asemănătoare conceptului de program, şi anume (Ipoteză - Date de intrare; Concluzie - Date de ieşire):

vlada_1_fig1

De exemplu, procesul de rezolvare a unei probleme poate fi descris astfel: există un număr de teoreme T1 , …, Tn determinate de ipotezele I1 , …, In şi de concluziile C1 , …, Cn; acestea sunt selectate şi apoi aplicate astfel încât să se poată realiza identificările : II1, C1I2, …, CnC, adică:

vlada_1_fig2

Această prezentare poate fi înţeleasă dacă, de exemplu, facem analogia cu rezolvarea problemelor de geometrie care necesită delimitarea ipotezei şi a concluziei, ca apoi să se utilizeze numai acele teoreme, propoziţii, proprietăţi care, pornind de la ipoteză, prin aplicarea lor succesivă, să se obţină concluzia cerută.

Evident, din experinţa căpătată în rezolvarea problemelor, se poate afirma faptul că selectarea teoremelor şi aplicarea lor se poate realiza doar prin "stăpânirea" domeniului respectiv la nivel de specialist sau de expert.

Este cunoscut faptul că fiinţele umane pot rezolva o problemă în trei moduri (metode evidenţiate de inteligenţa artificială):

  • pornind de la ipoteză şi obţinând concluzia ("metoda înlănţuirii înainte");
  • pornind de la concluzie şi obţinând ipoteza ("metoda înlănţuirii înapoi");
  • pornind simultan, de la ipoteză şi concluzie ("metoda mixtă").

În toate ştiinţele (matematică, fizică, chimie etc.) există multe probleme care, chiar dacă au fost studiate într-o anumită etapă, abordarea lor cu metode şi tehnici moderne poate să trezească oricând interesul tinerilor, al cercetătorilor în general. Această afirmaţie poate fi susţinută cu atât mai mult cu cât, astăzi, prin utilizarea unor metode specifice tehnologiei informaţiei şi prin utilizarea calculatorului, se pot concepe tehnici care altă dată erau imposibil de imaginat.

Din punct de vedere metodologic, trebuie să ne obiş- nuim să reformulăm problemele în mod explicit şi adecvat rezolvării lor matematice sau - când este posibil - cu ajutorul calculatorului. Pentru acest lucru trebuie să cunoaş- tem "limitele" gândirii demonstrative şi în acelaşi timp "limitele" gândirii algoritmice, apoi să cunoaştem performan- ţele calculatoarelor.

Să amintim aici istoria problemei celor patru culori care începe în anul 1852, când studentul englez Francis Guthrie a enunţat următoarea problemă pentru colorarea unei hărţi [11, 21]:

"Sunt suficiente patru culori pentru a colora o hartă care reprezintă diverse ţări, cu condiţia ca oricare două ţări vecine (care au frontiera comună) să fie colorate cu culori diferite".

Mulţi matematicieni cu renume au studiat această problemă (A. de Morgan, A. Cayley, A. B. Kempe, H. Heesch, K. Appel, W. Hakel), dar rezolvarea ei completă nu a fost posibilă decât în anul 1977 (K. Appel, W. Hakel, "The four color problem" în Mathematics Today, L. A. Steen(ed.), Springer Verlag, 1978) şi acest lucru numai după ce s-a utilizat calculatorul, deoarece fiind o problemă combinatorială cu spaţiul soluţiilor de ordin foarte mare, a fost necesară conceperea unei metode algoritmice pentru căutarea eficientă cu ajutorul calculatorului.

Teoretic, problema a fost rezolvată în cazul a cinci culori. De altfel, rezolvarea acestei probleme a impus în informatică o metodă devenită clasică în domeniul elaborării algoritmilor: metoda backtracking.

În zilele noastre apar tot mai des probleme a căror rezolvare (proces demonstrativ) este rezultatul îmbinării metodelor pur matematice cu metodele algoritmice (computaţionale).

Uneori, rezultatele computaţionale pot oferi surse de inspiraţie pentru metodele matematice. Informaticienii au şi venit în întâmpinarea matematicienilor şi specialiştilor prin elaborarea diverselor sisteme de programe care realizează calcule numerice, logice, simbolice, reprezentări spaţiale etc. cu ajutorul cărora pot fi dobândite cunoştinţe de matematică sau se pot rezolva probleme din diverse domenii.

Totuşi, aceste aspecte nu trebuie să conducă la neglijarea procesului demonstrativ. Cele mai utilizate astfel de sisteme de programe sunt: Mathematica, Statistica, Matlab, Mathcad, Derive, Maple, Origin, SlideWrite, Workplace, Eureka etc.

Este cunoscut faptul că în ştiinţele naturii se obţin rezultate deosebite prin îmbinarea metodelor teoretice cu metodele experimentale. Pentru matematică (şi alte ştiinţe), informatica (tehnologia informaţiei) este cea care oferă rezultate experimentale prin utilizarea calculatorului în rezolvarea problemelor.

Metoda algoritmică va fi un experiment pentru justificarea rezultatelor procesului demonstrativ de la metoda matematică, dar în acelaşi timp poate să fie o metodă de rezolvare independentă.

Metoda algoritmică trebuie să substituie rezultatele obţinute pe cale teoretică prin metode computaţionale eficiente ţinând seama de limitele proceselor algoritmice şi de performanţele calculatoarelor. Este adevărat că uneori metodele matematice pot conduce la simplificarea metodelor algoritmice şi invers.

Elevii care participă la olimpiadele şcolare de informatică au constatat că, de multe ori, o analiză profundă a abordării matematice poate să conducă la obţinerea unei metode algoritmice eficiente.

Participanţii la olimpiadele de matematică pot constata acelaşi lucru la o analiză profundă a abordării algoritmice. De aici, importanţa atât a proceselor demonstrative (metode matematice), cât şi a proceselor computaţionale (metode algoritmice).

În funcţie de natura metodelor / tehnicilor implementate în procesele computaţionale, algoritmii pot fi: numerici, seminumerici, formali, combinatoriali, neuronali, de căutare, de sortare, recursivi, de rescriere, secvenţiali, paraleli, determinişti, nedeterminişti, probabilistici, aleatori, euristici, de tip Monte Carlo, genetici, de simulare, geometrici computaţionali etc.

Definiţii matematice

Al-Khwarizmi, Muhammed ibn Musa (cca. 780 - cca. 850) a folosit pentru prima dată reguli precise şi clare pentru a descrie procese de calcul (operaţii aritmetice fundamentale) în lucrarea sa "Scurtă carte despre calcul algebric".

Mai târziu, această descriere apare sub denumirea de algoritm în "Elementele lui Euclid". Algoritmul lui Euclid pentru calculul celui mai mare divizor comun a două numere naturale este, se pare, primul algoritm cunoscut în matematică.

Iniţial, noţiunea de algoritm a fost considerată primară. În matematica modernă noţiunea de algoritm a primit mai multe definiţii:

  • algoritmul normal al lui A. A. Markov;
  • algoritmul operaţional al lui A. A. Leapunov;
  • maşina Turing / maşina cu stivă;
  • funcţii recursive;
  • sisteme POST.

Prima descriere a definiţiei matematice pentru noţiunea de algoritm a fost dată de matematicianul rus A. A. Markov. S-a demonstrat că din punct de vedere matematic aceste definiţii sunt echivalente.

În prezent, în domeniul probabilităţilor şi statisticii, sunt cunoscute aşa-numitele procese Markov. De altfel, astăzi se întâlneşte foarte frecvent conceptul de proces sub diverse ipostaze: în reprezentarea şi execuţia algoritmilor, în funcţionarea sistemelor de calcul, în execuţia sistemelor de operare, în execuţia programelor, în funcţionarea reţelelor de calculatoare etc.

În [5] se precizează: "… vom înţelege prin problemă algoritmică o funcţie total definită P: I F, unde I este mulţimea datelor de intrare ale algoritmului, iar F este mulţimea informaţiilor finale. Vom presupune că I şi F sunt nevide şi cel mult numărabile. O instanţă a problemei P este problema P(i), pentru o valoare particulară i din I. Intuitiv, considerăm că algoritmul este o pereche de funcţii (predicate) a = (f, g), unde f: I → [0, 1], g: I × F → [0, 1]. Predicatul f descrie elementele lui I care pot fi folosite ca întrebări, iar predicatul g indică legăturile care trebuie să existe între valorile de intrare şi cele de ieşire la terminarea algoritmului pentru care rezultatele furnizate de algoritm să fie corecte."

Ţinând seama de o astfel de definiţie, algoritmul (f, g) este parţial corect pentru problema P, dacă pentru orice instanţă P(i) este adevarată în ipoteza că g(I, P(I)) există. De asemenea, algoritmul (f, g) este total corect pentru problema P, dacă pentru orice instanţă P(i), cu f(i) adevărată, g(i, P(i)) există şi este adevarată.

În [6] se consideră că "Un algoritm poate fi definit ca o funcţie f: D F, unde F este mulţimea informaţiilor finale, iar D este mulţimea informaţiilor iniţiale".

Se evidenţiază faptul că un algoritm utilizează o memorie virtuală şi că prin executarea instrucţiunilor algoritmului se realizează schimbări ale valorilor unor locaţii de memorie, astfel că starea celulelor generează o succesiune de stări ale algoritmului (în execuţie, algoritmul este un proces dinamic).

O imagine intuitivă asupra noţiunii de algoritm este definiţia următoare: se presupun n celule de memorie c1, c2,…, cn, în care se pot introduce numere sau expresii, asfel încât fiecare celulă conţine, la un moment dat, un număr sau o expresie ori poate să fie vidă. Celulele ci, i = 1, 2, ..., n, împreună cu informaţia conţinută în ele formează starea iniţială S0. În funcţie de aceasta, algoritmul f efectuează anumite modificări asupra conţinutului celulelor ci. Se utilizează asfel o stare intermediară S1. Pornind de la S1, algoritmul f asigură în acelaşi mod, trecerea la o stare S2 etc. Un sistem de reguli al algoritmului precizează care stare, obţinută la un moment dat, poate fi declarată stare finală Sk: S0S1 → … → Sk-1Sk.

Vom vedea în cele ce urmează că pentru execuţia unui algoritm este necesară o maşina virtuală pentru interpretarea şi execuţia instrucţiunilor descrise de algoritm. Această execuţie constă în generarea şi desfăşurarea unui proces dinamic care va utiliza o memorie virtuală şi un procesor virtual pentru realizarea operaţiilor invocate de execuţia instrucţiunilor.

De fapt, procesele care se generează într-un sistem de calcul prin execuţia unui program scris într-un limbaj de programare, sunt reprezentări efective şi reale ale proceselor care se generează prin execuţia unui algoritm pe o ma- şină virtuală; maşina virtuală trebuie să simuleze o maşină reală, un calculator şi trebuie să fie constituită din memorie virtuală, procesor virtual şi dispozitive de intrare / ieşire virtuale).

Definiţii informatice

"Prin algoritm se înţelege o prescripţie care determină un proces de calcul şi care este precisă, perfect inteligibilă, nepermiţând nici un fel de interpretări din partea celui care o duce la îndeplinire"[8].

În [2] noţiunea de algoritm se defineşte astfel: "Algoritmul desemnează o mulţime exhaustivă şi univoc determinată de operaţii, împreună cu succesiunea în care trebuie aplicate asupra datelor iniţiale ale problemei, pentru a obţine soluţia. El este considerat mod de prezentare a procesului de rezolvare a problemelor şi suport după care se realizează programul".

De asemenea, în [7] se precizează următoarele: "Algoritmul este o noţiune primară. De obicei, prin algoritm se înţelege o secvenţă finită şi ordonată de operaţii, care pornind de la o mulţime finită de date (iniţiale), conduce (prin aplicarea în mod mecanic şi uneori repetată a operaţiilor) la o mulţime finită de rezultate. […] Modul de rezolvare a unei probleme este un algoritm, căci pornind de la date (prezentate în enunţul problemei) şi aplicând acestora un număr finit de operaţii ordonate (transformări, raţionamente etc.), ajungând la soluţia problemei, adică la rezultate".

În [1] conceptul de algoritm este descris astfel: "Prin algoritm vom înţelege o secvenţă finită de comenzi explicite şi neambigue care executate pentru o mulţime de date (ce satisfac anumite condiţii iniţiale I), conduce în timp finit la rezultatul corespunzător."

De asemenea, pentru înţelegerea noţiunii de algoritm, în [2] se precizează: "Soluţia unei probleme, din punct de vedere informatic, este dată printr-o mulţime de comenzi (instrucţiuni) explicite şi neambigue, exprimate într-un limbaj de programare. Această mulţime de instrucţiuni prezentată conform anumitor reguli sintactice formează un program. Un program poate fi privit şi ca un algoritm exprimat într-un limbaj de programare. Totuşi, un algoritm descrie soluţia problemei independent de limbajul de programare în care este redactat programul".

În legătură cu rezolvarea problemelor sub formă algoritmică, în [2] se arată faptul că nu este suficient ca o anumită problemă (clasă de probleme) să admită soluţii (chiar şi o singură soluţie). Din punct de vedere al informaticii (al practicii), interesează dacă există soluţia care poate fi descrisă algoritmic, deci dacă soluţia problemei poate fi construită efectiv. De asemenea, pentru rezolvarea anumitor probleme pot exista mai mulţi algoritmi (de exemplu, problemele de sortare [23]).

Stabilirea celui mai bun dintre aceştia se realizează în urma unui proces de analiză prin care se determină performanţa fiecăruia [1, 5, 12, 24, 25, 26].

Principalele caracteristici ale unui algoritm trebuie să fie ([1, 12, 25] ):

  • generalitate - algoritmul trebuie să fie cât mai general astfel ca să rezolve o clasă cât mai largă de probleme;
  • claritate / determinare - acţiunile algoritmului trebuie să fie clare, simple şi riguros specificate;
  • finitudine - acţiunile algoritmului trebuie să se termine după un număr finit de operaţii, aceasta pentru orice set de date valide;
  • corectitudine - algoritmul trebuie să producă un rezultat corect (date de ieşire) pentru orice set de date de intrare valide;
  • performanţă - algoritmul trebuie să fie eficient privind resursele folosite, şi anume să utilizeze memorie minimă şi să se termine într-un timp minim.

Întreaga activitate de cercetare şi elaborare de software din domeniul tehnologiei informaţiei este determinată de inventarea, conceperea, elaborarea, testarea şi implementarea de algoritmi performanţi şi utili. Marea diversitate a algoritmilor şi marea aplicabilitate a acestora în toate domeniile, face ca această temă să fie mereu actuală şi într-o continuă schimbare şi perfecţionare. Pentru mai multe detalii și explicații se poate consulta M. Vlada, Informatică aplicată. Modele de aproximare, software şi aplicaţii, Editura Universităţii din Bucureşti, PRINT, ISBN 778-606-16-0190-5, 257 pag., 2012.

Mai jos se află o schemă apărută în vechea Gazetă de Informatică din anul 2003 (Agora Media), în care se reprezintă schematic etapele parcurse de un proiect informatic de la concepere până la realizarea reală, și anume semnificațiile proiectului în relația client vs. informatician.

schema-proiect

Conceptele de algoritm și de proiect au revoluționat științe și au avut impact deosebit în planificarea, organizarea, execuția și controlul activităților umane și nu numai. Dacă cineva (amator, specialist sau expert) ar încerca să definească mai complet aceste concepte, cu siguranță nu va obține o definire completă. Este vorba despre dinamica semnificației / semanticii acestor concepte ce se schimbă rapid. Mai multe explicații la adresa web: http://mvlada.blogspot.ro/.

Bibliografie

  1. Albeanu Gr., Algoritmi şi limbaje de programare, Universitatea "Spiru Haret", Editura România de Mâine, Bucureşti, 2000
  2. Apostol C., Roşca I. Gh., Roşca V., Ghilic-Micu B., Introducere în programare. Teorie şi aplicaţii, Editura Bucureşti, 1993
  3. Georgescu H., Programare concurentă. Teorie şi aplicaţii, Editura Tehnică, Bucureşti, 1996
  4. Kinston J. H., Algorithms and Structures Design. Corectness, Analysis, Addison Wesley, Longman, 1998
  5. Mitrana V., Provocarea algoritmilor. Probleme pentru concursurile de informatică, Editura Agni, Bucureşti, 1994
  6. Odăgescu I., Optimizarea algoritmilor, Editura Militară, Bucuresti, 1991
  7. Perjeriu E., Văduva I., Îndrumar pentru lucrări de laborator la cursul de Bazele Informaticii, Universitatea din Bucureşti, 1986
  8. Popovici C., Georgescu H., State L., Bazele Informaticii, vol. I, Universitatea din Bucureşti, 1990
  9. Skiena S., The Algorithm Design Manual, Springer Verlag, New York, Inc., 1998
  10. Vlada M., Informatica, Universitatea din Bucureşti, Editura Ars Docendi, Bucureşti, 1999
  11. Vlada M., Poligoane stelate. Problema lui Hopf şi Pannwitz, Gazeta de matematică, nr. 8/1995, pag. 339-348
  12. Zaharia M. D., Structuri de date şi algoritmi. Exemple în limbajele C şi C++, Editura Albastră, Cluj-Napoca, 2002
  13. Cristea V., Giumale C., Kalisz E., Păunoiu Al., Limbajul C standard, Editura Teora, Bucureşti, 1992
  14. Popovici M. D., Popovici M. I., C++. Tehnologia orientată spre obiecte. Aplicaţii, Editura Teora, Bucureşti, 2000
  15. www.math.gatech.edu/~thomas/FC/fourcolor.html
  16. mathworld.wolfram.com/Four-ColorProblem.html
  17. spicerack.sr.unh.edu/~student/tutorial/fourColor/ FourColor.html
  18. mathcentral.uregina.ca/RR/database/RR.09.97/fisher1.html
  19. www.uccs.edu/~asoifer/book5.html
  20. www.uccs.edu/~asoifer/solve98.html
  21. www-groups.dcs.st-and.ac.uk/~history/BigPictures/ Guthrie.jpeg
  22. mathworld.wolfram.com/Algorithm.html
  23. www.cs.rit.edu/~atk/Java/Sorting/sorting.html
  24. faculty.juniata.edu/rhodes/cs2/ch129.htm
  25. www.scism.sbk.ac.uk/law/Section5/chap1/ s5c1p2.htm
  26. www.ics.uci.edu/~eppstein/161/people.html
  27. www.cs.pitt.edu/~kirk/algorithmcourses/
  28. www.gnacademy.org/text/cc/
  29. java.sun.com/docs/books/tutorial/java/concepts/
  30. www.accu.org/acornsig/public/articles/oop_c.html
  31. loki.cs.brown.edu:8081/webae/full.html

Marin Vlada

http://www.unibuc.ro/prof/vlada_m/