“Big O”: che significa?

di Lorenzo Neri
0 commento 121 visualizzazioni

Big O: che significa? C’è una spiegazione semplice a questa definizione? In questo articolo la approfondiamo per capirne ogni suo dettaglio.

Questo nome, questo “Big O” lo si trova spesso nei titoli accademici quando si studiano gli algoritmi, ma in particolar modo: la loro complessità.

C’è una definizione un po’ tecnichese, ma è la più semplice di tutte:

Big O è una notazione relativa alla rappresentazione di complessità di un algoritmo

Insomma, non suona molto lineare, cerchiamo di capire cosa significa davvero, andando ad analizzare parola per parola.

  • Relativa: quante volte ci hanno ripetuto il detto “Stai sommando mele con banane”? Il significato di relativo è riferito alla comparazione tra algoritmi. Per intenderci: non puoi comparare un algoritmo che esegue moltiplicazioni tra interi ad uno che ordina una lista di interi. Tuttavia, un algoritmo che esegue la moltiplicazione e uno che esegue l’addizione può darti informazioni significative.
  • Rappresentazione: Bene, ok, abbiamo capito bene o male che questa notazione “Big O” serve ad eseguire comparazioni tra algoritmi. Quando si fa un paragone di solito si possono utilizzare non poche metriche. Con Big O riduciamo il numero di metriche ad una sola, ovvero Big O stessa.

    Questa variabile è scelta in base ad osservazioni oppure assunzioni. Per esempio, gli algoritmi di ordinamento vengono confrontati di solito tramite le operazioni di comparazione (ovvero, comparando due elementi all’interno di un array, possiamo capire quale sia il loro effettivo ordine).
  • Complessità: se ci metto un secondo ad ordinare 10000 elementi, quanti ce ne metterò per ordinare un milione di elementi? La complessità in questo caso è una metrica relativa per misurare l’efficienza.

Ora, andiamo oltre, facendo degli esempi veri e propri per approfondire il significato di Big O.

Operazioni aritmetiche

L’esempio più basico che si possa fare per capire Big O, sono le operazioni aritmetiche. Prendiamo due numeri interi qualsiasi.

Le operazioni base che possiamo fare su questi due numeri sono addizione, sottrazione, moltiplicazione e divisione.

Ognuna di loro, può essere intesa come operazione oppure come problema. Un metodo per risolvere tale problema, lo denominiamo algoritmo.

L’addizione è la più semplice.

Come ci hanno sempre insegnato alle elementari, incolonniamo i due numeri e cominciamo a sommare le cifre una ad una, ricordandoci di eventuali riporti.

A questo punto, l’addizione abbiamo capito che è la parte più “costosa” del nostro algoritmo.

La ragione è semplice: per sommare due numeri da 6 cifre ciascuno per esempio, dobbiamo sommare 6 cifre tra di loro assieme, più un eventuale settima di riporto.

Se sommiamo due numeri da 100 cifre, dovremo eseguire 100 addizioni, se ne abbiamo due da 10000 cifre, ne dovremo eseguire 10000.

Riesci a intravedere il processo?

La complessità è direttamente proporzionale al numero di cifre che compongono i due numeri.

In questo caso, la definizione “Big O”, la usiamo per definire la complessità lineare, ovvero O(n).

Vediamo un po’ che fare con la moltiplicazione.

Torniamo al metodo che ci hanno insegnato a scuola.

Di solito, per la moltiplicazione, prendiamo le cifre del primo numero e le moltiplichiamo ciascuna per ognuna delle cifre del secondo, incolonnando poi i risultati ottenuti che andranno sommati assieme.

Per fartela breve, se abbiamo un numero da 100 cifre, dovremo eseguire 10000 moltiplicazioni e 200 addizioni.

Per due numero da un milione di cifre dovremo eseguire un trilione di moltiplicazioni e due milioni di addizioni.

Riesci a intravederlo anche qui il processo?

Più cresciamo con i numeri, più il numero di operazioni da fare è quadratico.

Quadratico, intendo dire che, prendiamo il numero di cifre che dobbiamo moltiplicare fra loro e il numero di operazioni da eseguire sarà quel numero di cifre elevato alla potenza di due.

In questo caso, siamo di fronte alla definizione di complessità quadratica, usando il vero significato di “Big O”, è O(n^2).

Perciò, concludendo, facendo sempre caso agli esempi che ho riportato, stiamo analizzando gli scenari peggiori.

Magari, fra le due operazioni che abbiamo eseguito prima, un numero ha 10 cifre e il secondo solo 4.

Ma in linea generale, bisogna sempre prendere il caso peggiore per stimare “Big O”.

Potrebbero interessarti

Lascia un commento

Questo sito potrebbe fare uso di cookie e siccome l'UE mi obbliga a fartelo presente, eccoti il classico banner dove puoi decidere come gestirli. Accetta Leggi di più