Complessità: criteri

Vogliamo individuare dei criteri oggettivi da usare per scegliere tra due algoritmi, risolutivi dello stesso problema, quello che offre prestazioni migliori.

Alcuni criteri per valutare un algoritmo e il software corrispondente potrebbero essere

  1. correttezza dell’algoritmo
  2. qualità dell’interfaccia utente
  3. comprensibilità ed espandibilità del codice
  4. piattaforma e strumenti di sviluppo
  5. velocità
  6. dimensione.

Correttezza

Un algoritmo risolve un problema se dà risposte esatte per ogni istanza del problema.

Per essere certi che il problema sia stato risolto completamente conviene utilizzare un ambiente di sviluppo integrato o aggiungere delle istruzioni specifiche per facilitare le fasi di testing e debugging.

Come possiamo essere sicuri della correttazza di un software?

  1. Non esiste un algoritmo che decida se un certo (qualsiasi) algoritmo è corretto.
  2. Non esiste un software commerciale, di una certa dimensione, senza errori.

Interfaccia utente

La facilità d’uso e la piacevolezza dell’interfaccia utente sono fattori determinanti nella scelta di un sistema informatico.

Le interfacce grafiche attuali competono con la soluzione del problema

  1. per il tempo di sviluppo necessario
  2. per il consumo di risorse hardware durante l’esecuzione.

Codice sorgente

Un codice sorgente che produce un software valido per diversi criteri ma che risulta incomprensibile è da scartare.

La documentazione del codice con commenti, schemi, manuali, … è essenziale perché un codice può risultare incomprensibile anche al suo autore se è passato molto tempo dalla stesura.

La strutturazione del codice in sottoprogrammi, moduli, librerie… lo rende più comprensibile e aggiornabile ma produrrà software più lungo e lento.

Piattaforma e strumenti di sviluppo

Hardware (CPU, RAM, …), sistema operativo, linguaggio di programmazione, compilatore, … concorrono alle caratteristiche finali del codice ma per semplificare il confronto supponiamo che siano fissati.

  1. Un sistema informatico aziendale in passato rimaneva praticamente immutabile per decenni.
  2. I sistemi industriali devono durare più decenni per essere ammortizzati.
  3. Gli elettrodomestici intelligenti (console, decoder, TV, …)  non sono praticamente aggiornabili dopo l’acquisto.

Velocità e dimensione

Occupiamoci del consumo atteso di risorse hardware generiche ma sempre presenti: CPU, RAM, memoria di massa.
Vogliamo ottenere la massima velocità e la minima dimensione per il nostro prodotto.

La velocità di esecuzione di un programma è condizionata dalle diverse velocità di accesso e diverse capacità dei dispositivi di memorizzazione

Velocità Capacità
CPU 2 GHz ~KB
Cache 1 GHz ~MB
RAM 0.5 GHz ~GB
HD 0,1 GHz ~TB

È evidente che utilizzare strutture dati quanto più piccole possibile significa garantire ad esse maggiore vicinanza al microprocessore, quindi maggiore velocità di accesso e quindi minor tempo d’esecuzione.

Il consumo di memoria porta a definire dei criteri di complessità in spazio mentre quello della CPU viene caratterizzato dalla complessità in tempo (di occupazione della CPU).

I due criteri precedenti sono collegati tra loro, posso progettare un codice

  1. molto corto (e veloce…) ma che si basa su enormi quantità di dati;
  2. molto lungo (e lento…) ma che si basa su minime quantità di dati.

Se diamo per scontato che tutti i criteri precedenti siano sempre applicati allora non rimane che mettere in discussione le singole istruzioni, cioè l’algoritmo.