Treci la conținutul principal

Big O pentru memorie

Big O poate descrie memoria la fel cum descrie timpul: de cât spațiu suplimentar are nevoie algoritmul pe măsură ce datele de intrare cresc?

Numărăm doar spațiul suplimentar — variabilele și tablourile pe care le creează algoritmul — nu și datele de intrare. Acest spațiu suplimentar se numește spațiu auxiliar.

Spațiu O(1): un număr fix de variabile, indiferent de datele de intrare. Spațiu O(n): se stochează ceva nou pentru fiecare element de intrare, de exemplu o copie sau un Map cu valorile deja văzute.


Spațiu O(1)

Un algoritm care păstrează doar câteva variabile simple folosește spațiu constant. Tabloul poate avea zece elemente sau zece milioane — algoritmul în sine tot doar contoarele sale le deține.

Însumarea, găsirea maximului și căutarea liniară au toate timp O(n), dar spațiu O(1): citesc mult și rețin aproape nimic.

Sumă cu o singură variabilă

Întregul algoritm reține exact un singur număr, sum. Consumul său de memorie nu crește odată cu tabloul: spațiu O(1).

Prompt
Scrie un program TypeScript care însumează tabloul de numere 3, 1, 4, 1, 5, 9, 2, 6 folosind o singură variabilă suplimentară și afișează suma, pentru a arăta un algoritm cu timp O(n), dar spațiu O(1).
Ieșire: program TypeScript și rezultatul capturat
Sum with one variable

Spațiu O(n)

De îndată ce algoritmul construiește ceva cu o intrare pentru fiecare element de intrare — un tablou nou, un Map — spațiul său este O(n): dublezi datele de intrare, dublezi memoria.

Asta nu este un lucru rău în sine. Este pur și simplu un cost pe care ar trebui să îl observi, pentru că poate fi schimbat pe altceva.

Construirea unui tablou nou

Tabloul de ieșire primește câte un element pentru fiecare element de intrare. 5 la intrare, 5 la ieșire — memoria crește în pas cu datele de intrare: spațiu O(n).

Prompt
Scrie un program TypeScript care construiește un tablou nou cu fiecare element al tabloului 1, 2, 3, 4, 5 dublat, adăugându-l într-un tablou gol, apoi afișează tabloul de intrare și tabloul de ieșire.
Ieșire: program TypeScript și rezultatul capturat
Build a new array

Schimbul spațiului pe timp

Deseori poți cheltui memorie ca să economisești timp. Exemplul clasic este Two Sum: găsirea a două numere dintr-un tablou care însumate dau o valoare țintă.

Calea directă verifică fiecare pereche — timp O(n²), spațiu O(1). Calea rapidă parcurge tabloul o singură dată și reține fiecare număr văzut într-un Map. Pentru fiecare număr se întreabă: „am văzut deja target - n?” — timp O(n), spațiu O(n).

Acest schimb merită de obicei: memoria poate fi adăugată unei mașini, timpul nu.

Two Sum cu două bucle

Fiecare pereche este verificată până apare o potrivire — până la 15 verificări pentru 6 elemente, iar numărul crește cu pătratul datelor de intrare. Nu se folosește memorie suplimentară.

Prompt
Scrie un program TypeScript care găsește două numere a căror sumă este 9 în tabloul 2, 11, 15, 1, 8, 7 verificând fiecare pereche cu două bucle imbricate și numărând verificările. Afișează fiecare potrivire împreună cu numărul de verificări de până atunci, iar la final afișează numărul total de verificări.
Ieșire: program TypeScript și rezultatul capturat
Two Sum with two loops

Two Sum cu un Map

O singură parcurgere, 6 verificări. Fiecare număr este căutat cu seen.has() și stocat cu seen.set() — lucru în timp constant pentru fiecare element. Map-ul este memoria O(n) care cumpără timpul O(n).

Prompt
Scrie un program TypeScript care găsește două numere a căror sumă este 9 în tabloul 2, 11, 15, 1, 8, 7 într-o singură parcurgere: păstrează un Map cu numerele deja văzute și, pentru fiecare număr, verifică dacă valoarea țintă minus numărul a fost deja văzută. Afișează fiecare potrivire, iar la final afișează că fiecare element a fost verificat o singură dată.
Ieșire: program TypeScript și rezultatul capturat
Two Sum with a Map