Benvenuto caro Lettore!

UF è un blog di ingegneria informatica pieno di articoli più o menoo tecnici. Iscriviti per rimanere aggiornato all'uscità dei prossimi articoli.

Ad Ad ads ads

Ricerca

22 giu 2010

Alberi binari di ricerca

un albero binario di ricerca è una struttura dati puntata che è :

-vuoto

-una terna T=(r,L.R) dove r è un nodo (radice),L e R sono alberi binari di ricerca.  Un L’albero binario di ricerca sopporta 2 strutture dati astratte: code con priorità e dizionari. Esempio di un albero binario di ricerca:

image

La proprietà degli alberi binari di ricerca


Per ogni nodo x,tutti i valori del sotto albero sinistro di x sono inferiori al valore di x  e tutti i valori del sotto albero destro di x sono superiori al valore di x.

Operazioni basilari


Insert:


image

image

Search:


Ricerca di un elemento x. Si confronta x alla radice ;

-se x inferiore si ricerca nel sotto albero sinistro.

-se x è maggiore ,si ricerca nel sotto albero  destro.

Analisi:

image

Delete:


image

Min e Max


il minimo si trova nel nodo piu a sinistra e il massimo si trova nel nodo piu a destra.

image

Successore e Predecessore


image

oppure

Quando right[x]=NIL,successore di x ??

image

Verifica : x è max del sotto albero sinistro di y

Ogni operazione in un albero binario impiega come tempo di esecuzione O(h),h essendo l’altezza dell’albero.

Per risolvere questo problema abbiamo due soluzioni :

-Alberi binari costrutti casualmente.

-Alberi bilanciati

Grazie di aver letto l’articolo. Dubbi ,domande e suggerimenti ?Lo spazio per i commenti è qui sotto.

avatarfirma

Quick Sort

Ciao a tutti,oggi parliamo del quick sort altro algoritmo di ordinamento. E un algoritmo sul posto che  prende in input una sequenza di elementi e produce una sequenza ordinata in output. Di solito si usa l’array come struttura dati della sequenza.

Anche quick sort usa il metodo divide e impera. Per ordinare gli elementi un array A[p..r] con quick sort si procede cosi:

image

Il punto fondamentale nel quick sort è capire come si fa a dividere un array in modo che ogni elemento del primo sotto array sia inferiore o uguale ad ogni elemento del secondo sotto array. Quicksort usa una procedura per farlo:

Partizione.

Analisi di partizione:


Questo è lo pseudo codice:

image

Domanda: ma questo algoritmo cosa fa nel dettaglio?

Per capirlo andiamo a dimostrarne la correttezza con l’invariante di ciclo.

Correttezza di partizione:


l’invariante di ciclo

image

1.Prima del ciclo


Le righe 2 e 3 formano 2 sotto vettori A[p..p-1]  (A[p..i]) e A[p..p-1] (A[i+1..j-1]) vuoti.

Quindi l’invariante è rispettato.

2.Durante il ciclo


Il ciclo score l’array A[p..r-1] con l’indice j e secondo il caso di figura ,mette l’elemento incontrato nel sotto vettore giusto:

-Le righe 5,6,7 si assicurano che ogni volta che abbiamo un elemento  piu piccolo del pivot x (riga 5),questo ultimo viene aggiunto al sotto vettore A[p..i] (la riga 6 aumenta di 1 la dimensione del sotto vettore e la riga 7 mette l’elemento A[j] nel sotto vettore giusto).

-Se invece l’elemento A[j] è maggiore del pivot x, non si fa niente perché la riga 8 li mette automaticamente  nel sotto vettore giusto cioè  A[i+1..j-1].

-La riga 8 serve a scorrere nel vettore A[j..r] con gli elementi che non sono ancora stati inseriti dentro i sotto vettori. L’incremento della riga 8 mette tutti gli elementi che non sono stati cambiati dalla riga 7 (perché magiori del pivot) dentro il sotto vettore A[i+1..j-1].

Quindi anche cui l’invariante di ciclo viene rispettato.

3.Dopo il ciclo


Alla fine j = r il che significa che il sotto vettore A[i+1..j-1] si ferma a r-1 prima del pivot A[r]. La riga 9 scambia il primo elemento di A[i+1..j-1] con A[r],il che significa che cambia questo sotto vettore in A[i+2..r].

Quindi l’invariante è rispettato e l’array è partizionato con il pivot in A[i+1]. da cui si capisce naturalmente la riga 10.

image

Tempo di esecuzione:


righe 1,2,3,9 e 10 impiegano un tempo costante.

il ciclo fa n-1 confronti quindi impiega :

image

Analisi di QuickSort


pseudocodice:

image

La valutazione delle prestazioni del QuickSort dipende dal bilanciamento dei sotto vettori costruito da partizione(). vediamo qualche caso di figura:

image

1. Caso peggiore:


image

2.Caso Migliore


La partizione si divide esattamente a metà ogni volta,allora si usa il teorema fondamentale.:

image

3.Caso 1/10:9/10


image

Grazie di aver letto l’articolo. Dubbi ,domande e suggerimenti ?Lo spazio per i commenti è qui sotto.

avatar firma

21 giu 2010

Merge Sort


Ciao a tutti ,oggi si parla di un altro algoritmo di ordinamento che prende in input una sequenza di elementi e produce una sequenza ordinata in output. Di solito si usa l'array come struttura dati della sequenza.

Merge Sort si basa sul metodo divide e impera :

1.Divide:  divide la sequenza di n elementi da ordinare in due sotto sequenze di (n/2) elementi ciascuno.

2.Impera: ordina le due sotto sequenze in modo ricorsivo con Merge sort

3.Combina: riunisce le due sequenze ordinate in una sequenza ordinata (soluzione del problema) con Merge.

Il caso elementare arriva quando la sotto sequenza da ordinare ha dimensione uno e quindi non c’è niente da fare perché in questo caso,la sotto sequenza è già ordinata.

Il punto fondamentale del nostro algoritmo rimane quindi la procedura Merge. Vediamo come funziona.

Analisi di Merge:


Immaginate di dover riunire due pacchetti  di carte già ordinate in un solo pacchetto che deve essere anche lui ordinato.

Intuitivamente si procede in questo modo.

1- Si prende la più piccola carta fra le due prime carte dei pacchetti iniziali (che rappresentano il minimo per ogni pacchetto). Si mette la carta presa nel terzo pacchetto.

2.Si ripete il passo 1 finche l’uno dei due pacchetti non si esaurisce.

3.se uno dei pacchetti è esaurito,si prende le carte del pacchetto rimanente e gli si mette nel terzo pacchetto nello stesso ordine.

Merge esegue il processo appena descritto.

Analisi di Merge Sort:


Ecco lo pseudo codice di Merge Sort:

image

Spiegazioni:


A è l’array rappresenta la sequenza da ordinare,p è l’indice del primo elemento e r l’indice dell’ultimo elemento.

Se p>=r ,l’array A[p…r] contiene al massimo un elemento e come detto prima è gia ordinato.

Nel caso contrario (p < r ):

- Si divide A[p..r] a metta in 2 array A[p..q] e A[q+1..r]

-Si impera A[p..q] e A[q+1..r] con Merge Sort

-Si combina  A[p..q] e A[q+1..r] con Merge

Esempio pratico:


Merge Sort è applicato all'array A=<5,2,4,6,1,3,2,6>.

image

Tempo di esecuzione:


Questo algoritmo è ricorsivo ,quindi il suo tempo di esecuzione è una ricorrenza.

Calcoliamo questa ricorrenza.

image

Nel peggior caso ,avremmo un tempo di esecuzione T(n) definito cosi:

image

image

Grazie di aver letto l’articolo. Dubbi ,domande e suggerimenti ?Lo spazio per i commenti è qui sotto.

avatar firma

5 concetti importantissimi in Informatica


Ciao a tutti, oggi vi parlerò di 5 concetti chiave quando si tratta di informatica,programmazione o algoritmi.

1. Caso migliore ,caso peggiore ,caso medio e poi??


Più volte usiamo queste parole per giudicare le prestazioni di un algoritmo.

T(n) è numero di operazioni elementari compiuto da un algoritmo. Per valutare la prestazione di un algoritmo ,ci interessa calcolare questo numero.
-Caso migliore

termine usato per riferirsi al caso di figura in cui è molto facile risolvere un problema con un certo algoritmo e un certo input. In generale in questo caso il numero di operazioni da eseguire dall’algoritmo il minor possibile.
-Caso peggiore

termine usato per riferirsi al caso di figura in cui il numero di operazioni da eseguire dall’algoritmo è il maggior possibile. Si può paragonare questo caso alla realità parlando della sfortuna.

Quindi T(n)=massimo tempo di esecuzione per qualsiasi input di dimensione n.
-Caso medio

termine usato per riferirsi al caso di figura in cui si cerca di predire qual’è il valore medio di T(n) su tutti gli ingressi possibili.

quindi T(n)= valore atteso del tempo di esecuzione su tutti gli ingressi di dimensione n.

Per farlo dobbiamo ipotizzare una distribuzione di probabilità sui dati di input.

Nella valutazione di un algoritmo ,quale caso usare per il calcolo di T(n)?


-Non si usa quasi mai nella valutazione di un algoritmo perché nei casi reali,non succede quasi mai.

-Di solito si usa il caso medio perché copre quasi tutti i casi di figura.

-Conviene però considerare anche il caso peggiore per le seguenti ragioni:
.il caso peggiore ci da un stima massima del tempo di esecuzione

.Capita molto spesso di avere un caso peggiore. Per esempio la ricerca di un dato inesistente in un database.

.A volte il caso medio è molto vicino al caso peggiore.

2.Invariante di ciclo


L’invariante di ciclo è un'affermazione usata per dimostrare la correttezza di un algoritmo. Vediamo come funziona:

Sostanzialmente,vogliamo dimostrare che un’affermazione è vera prima,all’interno e dopo un ciclo.  I passi sono 3:
1.Si dimostra che l’affermazione è vera prima del ciclo

2.si dimostra che l’affermazione rimane vera nel passaggio dell’iterazione i all’iterazione i+1.

3.si dimostra che l’affermazione è vera alla fine del ciclo

Nella maggior parte dei casi il verificarsi del caso 3 combacia con la correttezza dell’algoritmo.

3.Tipo di programmazione


Ce ne sono 3 fondamentali per gli algoritmi:

1.Procedurale


La programmazione procedurale è  una programmazione lineare nel senso che si va  sempre dritto un passo segue l’altro fino al passo finale. E quella più semplice e più naturale da usare.

2.Ricorsiva


La programmazione ricorsiva è una programmazione non lineare perché usa la ricorrenza. La ricorrenza è per un algoritmo ,il fatto di richiamare se stesso una o più volte con argomenti piu piccoli.  L’esempio piu naturale è quello del fattoriale : n!= n*(n-1)!

E molto usato e aiuta a risolvere problemi ripetitivi senza dover riscrivere o modificare più volte lo stesso algoritmo.

3.Dinamica


La programmazione dinamica è un modo di programmare che divide il problema in piccole istanze di se stesso per poi risolverli in modo ricorsivo e ricombinare l soluzioni. La cosa che lo rende dinamico è che le istanze del grande problema non sono indipendenti fra di loro,il  che significa che bisogna sempre tenere dei risultati ottenuti fino ad ora e cosi via.

Campo di applicazione: Problemi di ottimizzazione.

4.Divide and Impera:



Divide and Conquer è un  metodo di risoluzione di problema che consiste nel dividere un problema in piccole istanze di se stesso per poi risolverli in modo ricorsivo e ricombinare l soluzioni.  ci sono 3 passi:

1.Divide


Divide il problema  in sotto problemi cioè piccole istanze di se stesso.

2.Impera


Risolvere i sotto problemi in modo ricorsivo. Se la dimensione del sotto problema è abbastanza piccola,risolvere in modo diretto.

3.Combina


Combinare le soluzioni dei sotto problemi nella soluzione del Grande problema.

5.Analisi di un algoritmo ricorsivo


Valutare la complessità di un algoritmo ricorsivo ci pone davanti a un problema di ricorrenza cioè l’espressione del tempo di esecuzione è una ricorrenza di questo tipo:

image

Come si risolve questa ricorrenza?

esistono 3 modi:

1.Metodo di sostituzione


Questo metodo consiste in 2 passi:

-Congettura del valore di T(n)

-Usare l’induzione matematica per dimostrare la congettura appena fatta.

Esempio pratico:

image

2.Albero di ricorsione


Non è un metodo formale e non dimostra la ricorrenza. Si usa per capire cosa succede in dettaglio e per formulare  una congettura.

Esempio pratico:

image

image

3.Teorema Fondamentale


E un teorema che ci permette di risolvere molto velocemente una ricorrenza della forma:

image

dove  a >=1 e b > 1 sono costante e f(n) è una funzione e n rappresenta interi positivi.  Ci sono 3 casi:

image

Dimostrazione:


La  prima parte della dimostrazione analizza la ricorrenza fondamentale con la supposizione che b sia una potenza esatta di n. Per questa parte ci sono 3 lemmi da dimostrare. Il primo riduce il problema della ricorrenza fondamentale al problema della valutazione di una sommazione. Il secondo lemma valuta questa sommazione. Il terzo lemma mette insieme il primo e il secondo per dimostrare il teorema fondamentale nel caso in cui b è una potenza esatta di n.
Lemma1:

image
Lemma2:

image
Lemma3:

image

Grazie per aver letto l’articolo. Dubbi,domande e suggerimenti?? spazio commenti si trova qui sotto.

avatar firma

18 giu 2010

La prima Legge di Laplace :Concetto e applicazione

Ciao a tutti,oggi tocca alla prima legge di Laplace: vi parlerò della definizione,di alcuni casi particolari e poi un applicazione.

Definizione


Il campo magnetico prodotto da una corrente è dato da

image

image

Casi particolari


Filo rettilineo di lunghezza 2a:

image

image

Applicazione:


image
Esercizio 37 pagina 638

image
Soluzione

image

image

avatarfirma

Ringraziamenti:

Siamo su Facebook

Google+