Structuri de date 101: Array-uri – O introducere vizuală pentru începători

Cunoașteți structurile de date pe care le folosiți în fiecare zi.

👋 Bine ați venit! Să începem cu un context vital. Permiteți-mi să vă întreb următorul lucru:
✅ Ascultați muzică pe smartphone-ul dumneavoastră?
✅ Păstrați o listă de contacte pe telefon?
✅ Ați văzut vreodată un clasament în timpul unei competiții?

Dacă răspunsul dumneavoastră este „da” la oricare dintre aceste întrebări, atunci este aproape sigur că ați folosit array-uri și nici măcar nu știați asta! 😃 Array-urile sunt structuri de date foarte puternice care stochează liste de elemente. Ele au aplicații nesfârșite. Ele sunt foarte importante în lumea informaticii.

În acest articol, veți afla avantajele și dezavantajele matricelor, structura, operațiile și cazurile de utilizare ale acestora.

Să începem! 👍

🔎 Profundă incursiune în structura de bază a array-urilor

Pentru a înțelege cum funcționează, este foarte util să vizualizați memoria computerului dumneavoastră ca pe o grilă, exact ca cea de mai jos. Fiecare informație este stocată într-unul dintre acele mici elemente (pătrate) care alcătuiesc grila.

Array-urile profită de această structură „grilă” pentru a stoca liste de informații conexe în locații de memorie adiacente, pentru a garanta o eficiență extremă în găsirea acelor valori. 🔳🔳🔳🔳 🔳

Puteți să vă gândiți la array-uri astfel:

Elementele lor sunt unul lângă altul în memorie. Dacă aveți nevoie să accesați mai mult de unul dintre ele, procesul este extrem de optimizat, deoarece calculatorul știe deja unde se află valoarea respectivă.

Frumos, nu-i așa? Haideți să aflăm cum funcționează acest lucru în culise! 😃

📚 Clasificare

Array-urile sunt clasificate ca structuri de date omogene deoarece stochează elemente de același tip.

Ele pot stoca numere, șiruri de caractere, valori booleene (adevărat și fals), caractere, obiecte și așa mai departe. Dar odată ce ați definit tipul de valori pe care îl va stoca matricea dvs., toate elementele sale trebuie să fie de același tip. Nu puteți „amesteca” diferite tipuri de date.

👀 Citirea valorilor – începe magia!

Puterea uimitoare a array-urilor vine din eficiența lor în accesarea valorilor. Acest lucru se realizează datorită structurii sale de tip grilă. Să analizăm acest lucru mai în detaliu.🔍

Când creați un array, voi:
– Îl atribuiți unei variabile. 👈
– Definiți tipul de elemente pe care le va stoca. 🎈
– Îi definiți dimensiunea (numărul maxim de elemente). 📚

💡 Notă: Numele pe care îl atribuiți acestei variabile este foarte important, deoarece îl veți folosi mai târziu în cod pentru a accesa valorile și pentru a modifica array-ul.

Dar cum puteți spune calculatorului ce valoare anume doriți să accesați? Aici intervine rolul vital al indicilor!

1️⃣ Indicii

Utilizați ceea ce se numește un „index” („indici” la plural) pentru a accesa o valoare dintr-un array. Acesta este un număr care se referă la locația în care este stocată valoarea.

După cum puteți vedea în diagrama de mai jos, primul element din array este menționat folosind indicele 0. Pe măsură ce vă deplasați mai departe spre dreapta, indicele crește cu unu pentru fiecare spațiu din memorie.

💡 Notă: Știu că pare ciudat la început să începi să numeri de la 0 în loc de 1, dar acest lucru se numește numerotare bazată pe zero. Este foarte frecventă în informatică.

Sintaxa generală de accesare a unui element este: <ArrayVariable>

De exemplu:
Dacă matricea dvs. este stocată în variabila myArray și doriți să accesați primul element (la indexul 0), veți folosi myArray

2️⃣ Memorie

Acum că știți cum să accesați valorile, să vedem cum sunt stocate matricele în memoria calculatorului dvs. Când definiți dimensiunea tabloului, tot acel spațiu din memorie este „rezervat” din acel moment pentru viitoarele valori pe care ați putea dori să le inserați.

💡 Notă: Dacă nu umpleți tabloul cu valori, acel spațiu va fi păstrat rezervat și gol până când o veți face.

De exemplu:
Să spunem că definiți un tablou de dimensiune 5, dar inserați doar o singură valoare. Tot spațiul rămas va fi gol și „rezervat” în memorie, așteptând atribuiri viitoare.

Acest lucru este esențial deoarece array-urile sunt extrem de eficiente în accesarea valorilor deoarece toate elementele sunt stocate în spații contigue în memorie. În acest fel, calculatorul știe exact unde să caute pentru a găsi informația solicitată.

Dar… există și un dezavantaj 😞 pentru că acest lucru nu este eficient din punct de vedere al memoriei. Rezervați memorie pentru operațiuni viitoare care s-ar putea să nu aibă loc. Acesta este motivul pentru care array-urile sunt recomandate în situațiile în care știți dinainte câte elemente veți stoca.

🔧 Operațiuni – În culise!

Acum că știți ce sunt array-urile atunci când sunt folosite și cum stochează ele elemente, ne vom scufunda în operațiile lor, cum ar fi inserția și eliminarea.

1️⃣ Inserție – Bine ați venit!

Să spunem că avem un array de dimensiune 6 și că mai există un spațiu gol. Dorim să inserăm un element „e” la începutul tabloului (indice 0), dar acest loc este deja ocupat de elementul „a”. Ce ar trebui să facem?

Pentru a insera în array-uri, mutăm toate elementele aflate în dreapta locului de inserție, cu un indice în dreapta. Elementul „a” va fi acum la indexul 1, elementul „b” va fi la indexul 2 și așa mai departe…

💡 Notă: Va trebui să creați o variabilă pentru a ține evidența ultimului index care conține elemente. În diagrama de mai sus, matricea este umplută până la indexul 4 înainte de inserție. În acest fel, puteți determina dacă array-ul este plin și ce index ar trebui să folosiți pentru a insera un element la sfârșit.

După ce faceți acest lucru, elementul nostru este inserat cu succes. 👏

⚠️ Așteptați un minut! Ce se întâmplă dacă array-ul este plin?

Ce credeți că se va întâmpla dacă array-ul este plin și încercați să inserați un element? 😱

În acest caz, trebuie să creați un nou array, mai mare, și să copiați manual toate elementele în acest nou array. Această operațiune este foarte costisitoare, din punct de vedere al timpului. Imaginați-vă ce s-ar întâmpla dacă ați avea un array cu milioane de elemente! Această operațiune ar putea dura foarte mult timp pentru a fi finalizată. ⏳

💡 Notă: Singura excepție de la această regulă, când inserarea este foarte rapidă, este atunci când introduceți un element la sfârșitul array-ului (la indexul situat în dreapta ultimului element) și mai există încă spațiu disponibil. Acest lucru se face în timp constant O(1).

2️⃣ Deletion- Bye, Bye!

Acum să spunem că doriți să ștergeți un element din array.

Pentru a păstra eficiența accesului aleatoriu (putând accesa array-ul printr-un index extrem de rapid) elementele trebuie stocate în spații contigue de memorie. Nu puteți pur și simplu să ștergeți elementul și să lăsați acel spațiu gol.

Ar trebui să mutați elementele care vin după elementul pe care doriți să îl ștergeți cu un index la stânga.

Și în final, aveți acest array rezultat 👇. După cum puteți vedea, „b” a fost șters cu succes.

💡 Notă: Ștergerea este foarte eficientă atunci când se elimină ultimul element. Din moment ce trebuie să creați o variabilă pentru a ține evidența ultimului indice care conține elemente (în diagrama de mai sus, indicele 3), puteți elimina direct acel element folosind indicele.

3️⃣ Găsirea unui element

Aveți trei opțiuni pentru a găsi un element într-un array:

  • Dacă știți unde se află, folosiți indexul.
  • Dacă nu știți unde se află și datele dvs. sunt sortate, puteți folosi algoritmi pentru a vă optimiza căutarea, cum ar fi Binary Search.
  • Dacă nu știți unde este localizat și datele dvs. nu sunt sortate, va trebui să căutați prin fiecare element din matrice și să verificați dacă elementul curent este elementul pe care îl căutați (vă rugăm să consultați secvența de diagrame de mai jos).

👋 În rezumat…

  • Array-urile sunt structuri de date extrem de puternice care stochează elemente de același tip. Tipul elementelor și dimensiunea tabloului sunt fixe și definite atunci când îl creați.
  • Memoria este alocată imediat după crearea tabloului și este goală până când îi atribuiți valorile.
  • Elementele sunt localizate în locații contigue în memorie, astfel încât pot fi accesate foarte eficient (acces aleatoriu, O(1) = timp constant) folosind indici.
  • Indicii încep de la 0, nu de la 1 cum suntem obișnuiți.
  • Inserarea elementelor la începutul sau la mijlocul array-ului implică mutarea elementelor spre dreapta. În cazul în care array-ul este plin, crearea unui array nou, mai mare (ceea ce nu este foarte eficient). Inserarea la sfârșitul tabloului este foarte eficientă, timp constant O(1).
  • Îndepărtarea elementelor de la începutul sau din mijlocul tabloului implică mutarea tuturor elementelor spre stânga pentru a evita lăsarea unui spațiu gol în memorie. Acest lucru garantează că elementele sunt stocate în spații contigue în memorie. Eliminarea la sfârșitul tabloului este foarte eficientă deoarece se șterge doar ultimul element.
  • Pentru a găsi un element, trebuie să verificați întregul tablou până când îl găsiți. Dacă datele sunt sortate, puteți folosi algoritmi precum Binary Search pentru a optimiza procesul.

„Învață de ieri, trăiește pentru azi, speră pentru mâine. Important este să nu te oprești din a pune întrebări.”
– Albert Einstein

👋 Mulțumesc!

Sper din tot sufletul că v-a plăcut articolul meu. ❤️
Să mă urmăriți pe Twitter pentru a găsi mai multe articole ca acesta. 😃

Lasă un răspuns

Adresa ta de email nu va fi publicată.