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 intrarea crește?

Numărăm doar spațiul suplimentar — variabilele și listele pe care le creează algoritmul — nu și intrarea însăși. Acest spațiu suplimentar se numește spațiu auxiliar.

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


Spațiu O(1)

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

Î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.

Suma cu o singură variabilă

Întregul algoritm reține exact un număr, total. Memoria folosită nu crește odată cu lista: spațiu O(1).

Prompt
Scrie un program Python care însumează lista 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 Python complet
Sum with one variable

Spațiu O(n)

De îndată ce algoritmul construiește ceva cu câte o intrare pentru fiecare element de intrare — o listă nouă, un dicționar — spațiul său este O(n): intrare dublă, memorie dublă.

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

Construirea unei liste noi

Lista de ieșire primește câte un element pentru fiecare element de intrare. 5 intră, 5 ies — memoria crește în același ritm cu intrarea: spațiu O(n).

Prompt
Scrie un program Python care construiește o listă nouă cu fiecare element al listei 1, 2, 3, 4, 5 dublat, adăugând elementele într-o listă goală într-o buclă, apoi afișează lista de intrare și lista de ieșire.
Ieșire: program Python complet
Build a new list

Spațiu în schimbul timpului

Deseori poți folosi memorie pentru a economisi timp. Exemplul clasic este Two Sum: găsește două numere dintr-o listă care adunate dau o valoare țintă.

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

De obicei acest schimb merită: memorie se poate adăuga unui calculator, timp 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 lor crește cu pătratul intrării. Nu se folosește memorie suplimentară.

Prompt
Scrie un program Python care găsește două numere care adunate dau 9 în lista 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 Python complet
Two Sum with two loops

Two Sum cu o mulțime

O singură parcurgere, 6 verificări. Fiecare număr este căutat și stocat în mulțimea seen — muncă în timp constant pentru fiecare element. Mulțimea este memoria O(n) care cumpără timpul O(n).

Prompt
Scrie un program Python care găsește două numere care adunate dau 9 în lista 2, 11, 15, 1, 8, 7 dintr-o singură parcurgere: păstrează o mulțime de numere văzute și, pentru fiecare număr, verifică dacă ținta 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 Python complet
Two Sum with a set