Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


La complessità computazionale: algoritmi, costo e classi di complessità, Sintesi del corso di Informatica

Riassunto capitolo complessità computazionale dal libro Informatica App 3

Tipologia: Sintesi del corso

2018/2019
In offerta
30 Punti
Discount

Offerta a tempo limitato


Caricato il 22/05/2019

alessia-gobbini
alessia-gobbini 🇮🇹

3.9

(17)

21 documenti

1 / 3

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
LA COMPLESSITÀ’ COMPUTAZIONALE
Cos'è un algoritmo
Un algoritmo sono una serie di azioni elementari indicate in modo preciso e sistematico che, se
eseguite in sequenza, conducano a risolvere un dato problema (ex. Ricetta).
Deve essere preciso perché progettato per essere utilizzato da un automa, cioè da qualcosa che
non è in grado di ragionare e prendere decisioni.
Un azione si dice elementare quando non può essere scomposta in altre azioni più semplici; è
chiamata anche istruzione ed è interpretabile in modo univoco.
Un procedimento risolutivo di un problema è un algoritmo quando può essere descritto per mezzo di
un insieme finito di azioni elementari univocamente interpretabili e definite, che formano una
successione ordinata e finita di passi, la cui esecuzione si arresta per fornire i risultati del
problema partendo dai valori assunti dai dati iniziali.
Qualità di un algoritmo
L’impiego dell’algoritmo più efficiente si traduce in un risparmio di risorse computazionali e, di
conseguenza, in un risparmio di tempo e di denaro. Di ogni algoritmo dobbiamo considerare due
aspetti:
la sua organizzazione interna: la struttura data alle sue istruzioni e le strutture dati utilizzate
le risorse necessarie: in particolare la memoria e il processore, strettamente legate allo
spazio e al tempo necessari per la sua esecuzione.
Ogni algoritmo può essere tradotto in diversi programmi scritti in diversi linguaggi di programmazione
e ogni programma verrà, a sua volta, trasformato in più processi a tempo di esecuzione.
Per valutare la bontà di un algoritmo non ci riferiremo direttamente all’algoritmo ma alle risorse che
utilizzerà. se finora l’obiettivo era, dato un problema, scriverne la soluzione sotto forma di algoritmo
corretto e funzionante e codificarlo in un linguaggio di programmazione, ora l’obiettivo è:
Dati uno o più algoritmi che risolvono un problema, confrontarli per poi individuare il migliore sulla
base di un'analisi qualitativa.
Tra le risorse particolare attenziona va posta allo spazio di memoria e al tempo di esecuzione. Per
risorsa spazio intendiamo l’area di memoria occupata da un processo durante la sua esecuzione. Ci
riferiamo sia quella utilizzata per la memorizzazione della struttura dati, sia a quella necessaria per la
memorizzazione del codice stesso, dei suoi dati di input e dei risultati intermedi.
Parlando di risorsa tempo intendiamo il tempo di esecuzione del processo legato all’algoritmo. Dato
che i computer odierni sono dotati di una grande memoria la risorsa spazio è diventata meno
importante e ci occuperemo quindi esclusivamente della risorsa tempo.
Gli algoritmi buoni sono considerati tali se sono:
soluzioni semplici, efficaci e soprattutto generali
facilmente modificabili in caso di necessità
indipendenti dal linguaggio di programmazione
Costo di un algoritmo
Valutare il tempo di esecuzione esprimendolo in unità solari è un modo errato perchè poco attendibile
in quanto i risultati dipendono esclusivamente dalle condizioni in cui è stato fatto il test, cioè:
dalla velocità di esecuzione dell’elaboratore
dalla velocità dell’interprete o del compilatore
dalla dimensione e dalla disposizione dei dati forniti in input, cioè da quanti dati arrivano in
input e da come vengono proposti (in modo ordinato o disordinato)
Il confronto potrà essere valido se le condizioni di esecuzione sono uguali (stesso compilatore,stesso
computer,stessi dati nello stesso ordine).
Per valutare la bontà di un algoritmo occorre considerare esclusivamente l’algoritmo in sé e non la
sua implementazione.
pf3
Discount

In offerta

Anteprima parziale del testo

Scarica La complessità computazionale: algoritmi, costo e classi di complessità e più Sintesi del corso in PDF di Informatica solo su Docsity!

LA COMPLESSITÀ’ COMPUTAZIONALE

Cos'è un algoritmo

Un algoritmo sono una serie di azioni elementari indicate in modo preciso e sistematico che, se eseguite in sequenza, conducano a risolvere un dato problema (ex. Ricetta). Deve essere preciso perché progettato per essere utilizzato da un automa , cioè da qualcosa che non è in grado di ragionare e prendere decisioni. Un azione si dice elementare quando non può essere scomposta in altre azioni più semplici; è chiamata anche istruzione ed è interpretabile in modo univoco. Un procedimento risolutivo di un problema è un algoritmo quando può essere descritto per mezzo di un insieme finito di azioni elementari univocamente interpretabili e definite , che formano una successione ordinata e finita di passi, la cui esecuzione si arresta per fornire i risultati del problema partendo dai valori assunti dai dati iniziali.

Qualità di un algoritmo

L’impiego dell’algoritmo più efficiente si traduce in un risparmio di risorse computazionali e, di conseguenza, in un risparmio di tempo e di denaro. Di ogni algoritmo dobbiamo considerare due aspetti:

  • la sua organizzazione interna : la struttura data alle sue istruzioni e le strutture dati utilizzate
  • le risorse necessarie: in particolare la memoria e il processore, strettamente legate allo spazio e al tempo necessari per la sua esecuzione. Ogni algoritmo può essere tradotto in diversi programmi scritti in diversi linguaggi di programmazione e ogni programma verrà, a sua volta, trasformato in più processi a tempo di esecuzione. Per valutare la bontà di un algoritmo non ci riferiremo direttamente all’algoritmo ma alle risorse che utilizzerà. se finora l’obiettivo era, dato un problema, scriverne la soluzione sotto forma di algoritmo corretto e funzionante e codificarlo in un linguaggio di programmazione, ora l’obiettivo è: Dati uno o più algoritmi che risolvono un problema, confrontarli per poi individuare il migliore sulla base di un'analisi qualitativa. Tra le risorse particolare attenziona va posta allo spazio di memoria e al tempo di esecuzione. Per risorsa spazio intendiamo l’area di memoria occupata da un processo durante la sua esecuzione. Ci riferiamo sia quella utilizzata per la memorizzazione della struttura dati, sia a quella necessaria per la memorizzazione del codice stesso, dei suoi dati di input e dei risultati intermedi. Parlando di risorsa tempo intendiamo il tempo di esecuzione del processo legato all’algoritmo. Dato che i computer odierni sono dotati di una grande memoria la risorsa spazio è diventata meno importante e ci occuperemo quindi esclusivamente della risorsa tempo. Gli algoritmi buoni sono considerati tali se sono:
  • soluzioni semplici , efficaci e soprattutto generali
  • facilmente modificabili in caso di necessità
  • indipendenti dal linguaggio di programmazione

Costo di un algoritmo

Valutare il tempo di esecuzione esprimendolo in unità solari è un modo errato perchè poco attendibile in quanto i risultati dipendono esclusivamente dalle condizioni in cui è stato fatto il test, cioè:

  • dalla velocità di esecuzione dell’elaboratore
  • dalla velocità dell’interprete o del compilatore
  • dalla dimensione e dalla disposizione dei dati forniti in input, cioè da quanti dati arrivano in input e da come vengono proposti (in modo ordinato o disordinato) Il confronto potrà essere valido se le condizioni di esecuzione sono uguali (stesso compilatore,stesso computer,stessi dati nello stesso ordine). Per valutare la bontà di un algoritmo occorre considerare esclusivamente l’algoritmo in sé e non la sua implementazione.

Per ottenere una valutazione affidabile, nel seguito della nostra analisi misureremo il tempo di esecuzione in numero di operazioni (assegnazioni, scambi, confronti, operazioni di I/O e così via) che l’algoritmo deve compiere per fornire i risultati. chiameremo tale numero costo dell’algoritmo. Regole di valutazione per il calcolo del costo delle istruzioni di un algoritmo:

  • Istruzioni semplici costo=
  • Costrutti iterativi si sommano il costo del test (costo=1) e i costi del ciclo (somma dei costi delle singole istruzioni).
  • Se il ciclo viene iterato K volte costo=costo_testK + costo_corpoK (ex. DOWHILE .. WEND )
  • Se è un ciclo a controllo in testa (ex. WHILE … WEND ) il test viene eseguito K+1 volte perciò costo=costo_test(K+1) + costo_corpoK.
  • Il ciclo FOR ha un costo pari alla somma del costo dell’inizializzazione della variabile, del costo di condizione di fine ciclo (numero delle esecuzioni + ciclo conclusivo), del costo del corpo del ciclo e del costo di incremento (numero delle esecuzioni). Perciò: costo=1 + costo_test(K + 1) + costo_incrementoK + costo_corpo*K
  • costrutti di selezione IF/ELSE ha costo pari alla somma dei costi del testi più i costi delle istruzioni massime nel ramo IF oppure al costo delle istruzioni massime nel ramo ELSE: costo= 1 + Max(costo_IF , costo_ELSE)
  • chiamata di un sottoprogramma costo=1 + costo_sottoprogramma
  • istruzione composta costo uguale alla somma dei costi delle singole istruzioni semplici: costo= costo_istruzione1 + costo_istruzione2 + … + costo_istruzioneN I risultati ottenuti sono però approssimati dato che ci occupiamo solo delle operazioni dal costo dominante (sottrazioni e moltiplicazioni non hanno lo stesso costo). Il tempo di esecuzione di un algoritmo è proporzionale al suo costo infatti, conoscendo il tempo di esecuzione di un’operazione di costo unitario ( tempo unitario ), basterà moltiplicare il costo complessivo dell’algoritmo per esso per trovare il tempo totale di esecuzione dell’algoritmo.

Complessità computazionale

Il numero di operazioni di un algoritmo è legato alla dimensione dei dati in input. Usiamo la notazione generica T(N) per indicare la funzione matematica che indica la relazione esistente tra il numero di operazioni di un programma e la dimensione N dei dati in input. La funzione T(N) è chiamata complessità computazionale (in tempo) o semplicemente complessità dell’algoritmo. La dimensione N dei dati in input è anche detta dimensione del problema.

Complessità e valori dei dati di ingresso

La complessità è legata ai valori dei dati in input a e come i dati sono disposti , oltre che alla loro dimensione. Per valutare le prestazioni di alcuni algoritmi si dovrebbero prevedere i tre tipi di analisi e le loro rispettiva funzioni complessità:

  • analisi nel caso ottimo TOttimo(N), utilizzata molto nei sistemi del tipo real-time
  • analisi nel caso pessimo Tpessimo(N), quella che riveste maggiore importanza
  • analisi nel caso medio TMedio(N), si ricorre a questa analisi quando quella del caso medio risulta difficile. Fornisce una limitazione alla complessità dell’algoritmo RICERCA SEQUENZIALE RICERCA BINARIA CASO OTTIMO 1 1 CASO MEDIO N/2 log 2 N CASO PESSIMO N log 2 N