Elementi di Informatica di base

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

Algoritmi e Strutture Dati
Ricorrenze Il metodo di sostituzione Il metodo iterativo
Elementi di complessità
INFORMATICA Algoritmi fondamentali
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Analisi della complessità degli algoritmi
Analisi della complessità degli algoritmi
Informatica Generale Marzia Buscemi
Informatica Generale Alessandra Di Pierro
Algoritmi e Strutture Dati
Lez. 51 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Complessita'
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 1 Unintroduzione informale agli algoritmi Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi Paralleli e Distribuiti a.a. 2008/09
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmo di Ford-Fulkerson
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Unintroduzione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Problemi e algoritmi Anno Accademico 2009/2010.
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e strutture dati
Ordinamento di una lista: bubble-sort
1 2. Analisi degli Algoritmi. 2 Algoritmi e strutture dati - Definizioni Struttura dati: organizzazione sistematica dei dati e del loro accesso Algoritmo:
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente)
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
I numeri relativi by iprof.
Strutture di controllo in C -- Flow Chart --
Notazioni Asintotiche e Ordini di Grandezza delle funzioni
Intelligenza Artificiale
COMPLESSITÀ DEGLI ALGORITMI
Fibonacci Heaps e il loro utilizzo nell’algoritmo di Prim
Sistemi e Tecnologie Informatiche
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Radix-Sort(A,d) // A[i] = cd...c2c1
Algoritmi e Strutture Dati
RISOLVERE LE EQUAZIONI
La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Complessità di un algoritmo
Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante un algoritmo.
Complessità degli algoritmi (cenni) CORDA – Informatica A. Ferrari.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Ordinamento in tempo lineare Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
1 Ordinamento (Sorting) Input: Sequenza di n numeri Output: Permutazione π = tale che: a i 1  a i 2  ……  a i n Continuiamo a discutere il problema dell’ordinamento:
Analisi asintotica e Metodi di analisi Algoritmi e Strutture Dati.
Complessità Computazionale
Informatica 3 V anno.
Rudimenti di Complessità Corso di Programmazione II Prof. Dario Catalano.
Transcript della presentazione:

Elementi di Informatica di base Parte 8 Elementi di Informatica di base Dott.ssa Elisa Tiezzi

Complessità computazionale Per risolvere un problema spesso sono disponibili molti algoritmi diversi . Come scegliere il migliore? In genere si valuta la bontà di un algoritmo o si confrontano più algoritmi sulla base del comportamento che questi presentano al crescere della dimensione del problema.

Si vuole caratterizzare tale dimensione mediante un intero n che è precisamente identificato nella macchina di Turing come la lunghezza della porzione di nastro che contiene i dati di ingresso. Impiegando un elaboratore ed un suo linguaggio di programmazione, la dimensione n è lo spazio occupato, nella memoria dell’elaboratore, dei dati relativi al problema da risolvere, o più in generale un numero proporzionale a questo spazio.

Esempi: se si opera su un insieme, n sarà il numero dei suoi elementi se si opera su un grafo, n sarà il numero dei nodi o il numero di archi o la somma dei due numeri se si opera su matrici n sarà il numero dei suoi elementi

Complessità in tempo e complessità asintotica Fissata la dimensione n, il tempo che un algoritmo impiega a risolvere il problema si chiama complessità in tempo: nostro obiettivo principale sarà esprimere la complessità in tempo come funzione di n e spesso ci limiteremo a studiare il comportamento di tale funzione al crescere di n (complessità asintotica o semplicemente complessità) considerando così i soli termini prevalenti per e tralasciando a volte anche le costanti moltiplicative.

Perché si studia la complessità asintotica Lo studio della complessità asintotica è motivato dal fatto che gli algoritmi sono sempre definiti per n generico: se per valori piccoli di n due algoritmi possono avere efficienza confrontabile, è sempre quello che ha il termine massimo di grado più basso a richiedere minor tempo di esecuzione per un numero illimitato di valori di n superiori ad un opportuno valore n0 .

ATTENZIONE!!! Non saremo mai in grado di valutare il tempo effettivamente impiegato da un algoritmo, si dovrebbe mettere in bilancio il tempo di esecuzione delle singole frasi su uno specifico elaboratore.

Quello che faremo Ci limiteremo a contare le operazioni eseguite o alcune operazioni chiave o preminenti ammettendo che il tempo complessivo di esecuzione sia proporzionale al numero di tali operazioni. Tratteremo spesso come non significative le costanti moltiplicative e studieremo le funzioni di complessità nel loro ordine di grandezza.

Complessità in spazio La complessità in spazio è il massimo spazio invaso dalla memoria durante l’esecuzione dell’algoritmo, il quale può costruire insiemi di dati intermedi o di servizio, oltre ad operare sui dati iniziali e finali. Anche in questo caso ci si limita in genere allo studio della complessità asintotica. Poiché abbiamo a disposizione memorie grandissime a basso costo, studieremo la complessità in tempo.

Complessità e configurazioni La complessità di un algoritmo non può sempre essere caratterizzata da una sola funzione di complessità. A parità di dimensione di dati, il tempo di esecuzione può dipendere dalla specifica configurazione dei dati. Si considerano di solito tre differenti tipi di complessità: complessità nel caso medio, ottimo e pessimo.

Complessità media Valore della complessità di un algoritmo, mediato su tutte le possibili occorrenze iniziali dei dati. Si usa spesso la probabilità. Il calcolo è spesso difficile.

Complessità nel caso ottimo Si ottiene considerando, a parità di dimensione dei dati, la configurazione che dà luogo alminimo tempo di esecuzione. Tale complessità è perlopiù di interesse secondario anche se è abbastanza facile da determinare.

Complessità nel caso pessimo Si intende la complessità relativa a quella particolare occorrenza iniziale dei dati per cui l’algoritmo ha comportamento pessimo. Tale funzione di complessità fornisce un limite superiore alla complessità, entro cui il funzionamento dell’algoritmo è sempre garantito.

Crescita asintotica della complessità Le funzioni considerate rappresentano tempi di elaborazione e spazi di memoria e sono intrinsecamente non negative ( ed in genere crescenti con la dimensione dei dati n che è un intero non negativo). In genere ci interesseremo al limite della funzione complessità quando n∞ (studio della complessità in ORDINE DI GRANDEZZA).

Notazioni O(f(n)) è l’insieme di tutte le funzioni g(n) tali che esistono due costanti positive c e n0 per cui g(n)<=cf(n) per ogni n>= n0 g(n)O(f(n)) tradizionalmente si legge “g(n) è di ordine f(n)” e fornisce un limite superiore al comportamento asintotico della funzione.

Ω(f(n)) è l’insieme di tutte le funzioni g(n) tali che esistono due costanti positive c e n0 per cui g(n)>=cf(n) per ogni n>= n0. g(n)Ω(f(n)) tradizionalmente si legge “g(n) è di ordine Ω f(n)” e fornisce un limite inferiore al comportamento asintotico della funzione.

(f(n)) è l’insieme di tutte le funzioni g(n) che sono sia Ω f(n) sia Of(n). g(n)(f(n)) tradizionalmente si legge “g(n) è di ordine  f(n)”; la g si comporta asintoticamente esattamente come la f, per cui l’andamento di f caratterizza precisamente quello di g.

Applicata alla funzione di complessità, la notazione O ne delimita superiormente la crescita e fornisce un indicatore di bontà dell’algoritmo. La notazione Ω limita inferiormente la complessità, indicando così che il comportamento dell’algoritmo non è migliore di un comportamento assegnato.

Esempi: la funzione h(n)=3n2 +3n-1 è di ordine n2 perché esistono le costanti c=4 e n0=3 per cui h(n)<4n2 per n>=3. Notiamo che qualsiasi polinomio di grado k è di ordine nk e,in accordo con la definizione, è anche di ordine nj con j>k.

g(n)=3n2+2n+1 è O(n2) e anche O(n3) ma è anche di ordine (4n2), (n2), (n); Infine è di ordine (n2), (4n2), ma non di ordine (n) e neppure di ordine (n3)

Proprietà di O,  e  g  O(f) implica (f+g)  O(f) f1O(g1), f2O(g2) implica f1+ f2O(g1+g2) O e  sono relazioni riflessive e transitive  è una relazione di equivalenza fO(g) se e solo se g  (f)

Possiamo dividere ora gli algoritmi in classi, ponendo nella stessa classe quelli che hanno complessità asintotica dello stesso ordine di grandezza O.

Classi principali funzioni di ordine costante di ordine inferiori ad n, o sottolineari di ordine nlogn (la base del logaritmo è inessenziale perché logaritmi in basi diverse differiscono per una costante moltiplicativa: logay=logab x logby) di ordine n2,n3 ecc., o in genere polinomiali di ordine kn,nn..o in genere esponenziali

Un esempio:Ordinare un array Ordinare un elenco di elementi è un compito molto frequente ordinare numeri in modo crescente ordinare numeri in modo decrescente ordinare stringhe in modo alfabetico Vi sono molti modi per ordinare un elenco Selection sort uno dei più facili non il più efficiente, ma facile da capire e da programmare

Algoritmo Selection Sort Per ordinare un array di interi in modo crescente: cerca nell'array il numero più piccolo e scambialo con il primo elemento dell'array la parte ordinata dell'array è ora il primo elemento, mentre quella non ancora ordinata sono i rimanenti elementi cerca nella parte non ordinata il numero più piccolo e scambialo con il secondo elemento dell'array ripeti la ricerca e lo scambio fino a quando tutti gli elementi sono al posto giusto ogni iterazione aumenta di 1 la lunghezza della parte ordinata e diminuisce di 1 quella della parte non ordinata

Il codice public void selectionSort(int[] a) { int i, j, indexOfNextSmallest, min, temp; for (i = 0; i < a.length - 1; i++) min = a[i]; indexOfNextSmallest = i; for (j = i+1; j < a.length; j++) if (a[j] < min) min = a[j]; indexOfNextSmallest = j; } temp = a[i]; a[i] = a[indexOfNextSmallest]; a[indexOfNextSmallest] = temp;

Esempio

Complessità del Selection sort L’ordinamento per selezione ha un ciclo più esterno e uno più interno con proprietà simili, sebbene con scopi differenti. Il ciclo più esterno viene eseguito una volta per ogni valore nella lista e quello più interno confronta il valore scelto dal ciclo più esterno con molti, se non tutti, i valori rimanenti nella lista. Quindi esegue n2 confronti ove n è il valore di elementi della lista. Selection sort è quindi di ordine n2.