developedia.ro
Publicat în

Ce este o structura de date

Autori
  • avatar
    Name
    Gabriel Nechita
    Citeste articolul in:
    /8 min read

Despre acest articol

Pe acest blog vorbesc foarte mult despre structuri de date, dar ce reprezinta de fapt o structura de date si o intrebare mai importanta: care sunt structurile de date fundamentale?
Ce conține acest articol?

Ce sunt structurile de date

Structurile de date sunt in general niste concepte atat de "low-level" incat le luam de-a gata si nu ne gandim foarte profund la ce anume reprezinta ele cu adevarat: niste modalitati pentru a organiza si manipula datele.

Daca vrem o definitie mai sofisticata, putem sa ne uitam la definitia de pe Wikipedia care spune ca:

a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data - What is a data structure?

Structuri de date fundamentale

Cand inveti HTML, inveti sa "traduci" text intr-un limbaj pe care browserul il stie sa il afiseze cum trebuie utilizatorului. Tag-urile (<h1>, <div>, <p> etc) reprezinta modul tau de a structura datele, modalitati fundamentale definite de specificatia HTML5.

Cand inveti primul limbaj de programare, incepi sa folosesti array-uri, "dictionare", obiecte si alte structuri de date care nu iti sunt neaparat explicate pe larg, dar iti sunt introduse ca elemente de baza pe care trebuie sa le folosesti, pentru ca reprezinta lucruri triviale in viata de zi cu zi ale unui software developer.

Cand faci un Request si iti aduci niste date de pe un server, pe care urmeaza sa le afisezi unui user intr-o lista frumos formatata si stilizata, gata pentru consum, nu te gandesti foarte profund la modul in care stochezi informatia intr-o lista pe care limbajul de programare ti-o pune la dispozitie. Pur si simplu o faci, pentru ca asa ai facut de la inceput. Asadar, chiar daca nu ai fost constient sau nu ai gandit-o deliberat, mereu ai folosit "structuri de date" pentru a face ceea ce trebuie sa faci.

O analogie foarte buna despre cat de "de-a gata" luam structurile de date este condusul unei masini. Ca sofer, de cele mai multe ori esti interesat sa ajungi din punctul A in punctul B. Pe masura ce folosesti o masina, totusi, iti dai seama ca sunt aspecte pe care ar trebui sa le pricepi mai bine:

  • de ce stilul de condus influenteaza consumul de combustibil
  • care sunt diferentele dintre o masina care merge pe diesel si una pe benzina
  • de ce gabaritul unei masini influenteaza usurinta cu care o masina poate fi condusa, etc.

Cand conduci de curand o masina, este normal ca anumite detalii sa nu fie interesante pentru tine, pentru ca esti inca total concentrat pe dezvoltarea abilitatii tale de a conduce.

Totusi pe masura ce detii o masina de mai mult timp iti dai seama ca poate ar bine sa inveti iti rezolvi unele probleme singur sau sa stii cum sa il verifici pe meseriasul ala de la service care incearca sa te mai pacaleasca sa schimbi ceva inainte sa fie cazul 😉. Abia dupa ce capeti ceva experienta cu detinutul unei masini incepi sa cercetezi cu adevarat care sunt lucrurile care fac o masina sa fie masina.

O situatie similara experimentezi si cu structurile de date.

Vrei să înveți mai multe despre cum să fii un web developer mai bun?

Odată la 1-2 săptămâni îți voi trimite un rezumat cu cele mai interesante lucruri pe care le-am descoperit și cu articolele pe care le-am publicat pe acest blog.

0 spam. Te poți dezabona oricând. Nu voi folosi adresa ta de email în alte scopuri promoționale.

De ce trebuie sa stii cum functioneaza structurile de date

Daca este sa fim sinceri, majoritatea programatorilor isi duc existenta linistiti, fara ca ei sa se gandeasca foarte profund la ceea ce folosesc "by default" in munca lor zilnica.

Nu este un pacat, nu este nimic de blamat, aceasta este realitatea muncii de zi cu zi.

Multe lucruri pe care le presupui sunt cum sunt, pentru ca nu ai avut curiozitatea sau vreodata nevoia de a le explora mai in detaliu.

De asemenea, nu ajuta ca situatiile in care trebuie sa inveti despre cum functioneaza din punct de vedere conceptual o structura de date, sunt destul de rare si pe majoritatea programatorilor o sa ii ocoleasca, decat daca:

  • studiaza computer science in facultate (majoritatea programatorilor pe care eu ii cunosc sunt self-taught si nu au urmat o traiectorie clasica)
  • creezi un algoritm mai sofisticat care rezolva o problema care apare des in software development (majoritatea lucrurilor pe care le-am facut eu s-au rezolvat cu un Google Search sau cu pair programming)
  • esti intrebat la un interviu diverse lucruri generale si low-level (am patit-o o singura data la un interviu la care am reactionat foarte negativ, din pacate si am picat respectivul interviu)
  • jobul necesita o maiestrie deosebita a acestor concepte pentru ca creezi o tehnologie care face uz masiv de structuri de date si de algoritmi (eu nu am avut niciodata ocazia sa contribui la crearea de noi tehnologii, asadar nu m-am lovit de necesitatea cunoasterii acestor concepte)

As putea argumenta ca mai mult de 95% dintre programatori (made up statistic) nu vor avea niciodata nevoie de informatiile de mai jos.

Spun asta pentru ca nevoia mea de a stii toate acestea s-a rezumat la 1 interviu si cateva coding challenges in peste 8 ani de cariera.

Majoritatea companiilor cu care eu am interactionat au fost si sunt concentrate pe ce stii sa faci si nu pe abilitatile tale de a explica si a lucra cu concepte din structuri de date si algoritmi.

Totusi, daca vrei sa o aplici pentru o companie de tip Big Tech (orice firma de tip FAANG), sau daca doresti sa devii mai stapan pe abilitatile tale de a rezolva probleme de programare in mod eficient sau daca doresti sa aplici in retele de freelancing exclusiviste (precum Toptal), atunci poate ar trebui sa realizezi ca ar fi cazul sa iti acoperi aceste "knowledge gaps".

Spun asta pentru ca interviurile pentru companiile de mai sus foarte des se vor concentra pe coding challenges in care te vei folosi foarte mult de cunostinte temeinice din domeniul structurilor de date si de algoritmi.

Structuri de date fundamentale

Structurile de date fundamentale cu care tu vei interactiona cel mai des sunt urmatoarele:

  1. Stacks - Stive
  2. Queues - Cozi
  3. Arrays - Liste
  4. Linked Lists
  5. Hash Tables
  6. Graphs - Grafuri
  7. Trees - Arbori
  8. Strings - Siruri de caractere

Cu majoritatea, ai lucrat deja, fie ca ti-ai dat seama sau nu.

Unele structuri de date pot fi folosite cu un alt nume, in functie de limbajul de programare cu care lucrezi, dar ele de principiu au caracteristici de baza care sunt impartasite indiferent de implementarile lor.

Pe langa caracteristicile de baza, unele limbaje de programare aleg sa faca unele lucruri in plus sau in minus, in functie de problemele pe care doresc sa le rezolve.

De exemplu, array-urile in JavaScript sunt dinamice si nu trebuie sa specifici in avans care o sa fie lungimea array-ului tau (nu trebuie sa specifici cate elemente va accepta).

In Golang, array-urile sunt statice (fixe), adica trebuie sa mentionezi cate elemente o sa accepte. Totusi, Golang are si array-uri dinamice, numite slice-uri, care accepta un numar nedeterminat de elemente. JavaScript, in schimb, nu are o implmentare de array-uri statice.

Pe masura ce inveti mai mult si mai mult despre structuri de date fundamentale, iti va fi usor sa acumulezi cunostinte sofisticate despre cum anumite limbaje de programare implementeaza aceste structuri.

Motive pentru a intelege mai bine structurile de date

  1. Vei avea mai multa incredere in codul pe care il scrii, pentru ca vei acoperi knowledge gaps pe care probabil alti colegi le au sau nu le au. Ideea este ca o sa obtii mai multa incredere in procesul tau de dezvoltare a software-lului pe care il scrii.
  2. Iti va fi mai usor sa intelegi care sunt diferentele sau asemanarile dintre anumite limbaje de programare cu care probabil lucrezi deja sau iti doresti sa lucrezi.
  3. Vei intelege cum o anumita structura de date iti afecteaza eficienta unui algoritm.
  4. Diferentiere fata de ceilalti candidati. Daca vrei sa iesi in evidenta dintr-o stiva (hehe, buna gluma) de aplicanti, poate ar fi util sa adaugi la portofoliul de cunostinte si cunostinte temeinice despre "data structures".
  5. Poti impresiona mai usor in anumite procese de recrutare si sa treci cu usurinta de interviuri in care accentul se pune pe "data structures si algorithms".
  6. Poti reduce "sindromul impostorului". Un aspect prea putin discutat este faptul ca daca lucrezi cu oameni care au cunostinte temeinice de structuri de date, foarte des te vei simti stingher si te vei simti ca un impostor, pentru ca nu poti participa de la egal in conversatii de tipul acesta. Asadar, daca acest subiect te afecteaza, poate ar fi cazul sa iti cresti nivelul de competenta in acest subiect.
  7. Vei deveni mai competent in rezolvarea problemelor de "produs de la 0 la 1". Companiile care creaza produse de la 0 doresc sa intre pe piata cu solutii care pot fi replicate foarte greu, din acest motiv, au nevoie de oameni care pot "inventa" de la 0 algoritmi si solutii complexe, care poate nu au putut rezolvate de altii dinaintea lor.
  8. Vei intelege mai bine de ce unele lucruri de zi cu zi functioneaza cum functioneaza. Pe masura ce o sa inveti mai multe despre structuri date si algoritmi, vei observa ca vei intelege mai bine de ce anumite aplicatii sunt eficiente sau ineficiente, mai ales daca codul acestor aplicatii este open-source.