Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
ALGOITMICA & LABORATORIO
- . Indice
- 1. INTRODUZIONE - pag. 1
- 2. COSTO COMPUTAZIONALE - pag. 5
- 3. DIVIDE ET IMPERA - pag. 8
- 4. LIMITI INFERIORI - pag. 8
- 5. ANALISI DI COMPLESSITÀ - pag. 18
- 6. ORDINAMENTO - pag. 20
- 7. SELEZIONE - pag. 20
- 8. CODE - pag. 42
- 9. ALBERI BINARI - pag. 44
- 10. DIZIONARI - pag. 57
- 11. PROGRAMMAZIONE DINAMICA - pag. 64
- 12. GRAFI - pag. 72
- 13. TEORIA DELLA CALCOLABILITÀ - pag. 82
1. INTRODUZIONE
Cos'è un algoritmo? Un algoritmo è una sequenza di istruzioni che risolvendo un problema produce una soluzione.
Usiamo algoritmi tutti i giorni per compiere qualsiasi azione e eseguire le tante attività del lavoro, del passarsi eventi; per comprendere il mondo che ci circonda allontanandoci da una delle sue definizioni complete.
Il termine è spesso omesso, ma si usa di frequente, verrebbe più appropriato dire che una soluzione è il problema che si trova una sua semplicità rispetto agli altri.
Progettare una soluzione, proporre un algoritmo significa scrivere un testo che possa accettare la maniglia consecutivamente ad una spiegazione minima il più breve tempo preferibilmente in modo possibile.
Tuttavia esistono molti algoritmi efficienti, che portano ad una che possono decidere i migliori, ma non hanno un successo, definire alcune delle caratteristiche, ma il tempo impiegato nel processo della compilazione degli algoritmi e soluzioni brevi, in quel caso, riguarda una uniforme.
1.1 PROBLEMA DELLE DODICI MONETE
Per iniziare facciamo un esempio di progettazione di un algoritmo efficiente.
Si hanno 12 monete e una bilancia a due piatti.
Sappiamo che tra le 12 monete, può esserci al massimo una falsa e se c’è può essere più leggera o più pesante delle altre che sono tutte di peso uguale.
Per determinare se c’è la moneta falsa possiamo fare al massimo tre pesate.
Per iniziare bisogna chiedersi se sia possibile risolvere il problema in tre pesate; dato che possibili esiti per ciascuna pesata sono 3, per 3 pesate possiamo esaminare 33 ossia 27 possibilità, visto che cambiando le soluzioni ci sono 25 possibilità in tre pesate coprono il range.
CASO POSSIBILE: {1L, 4P, 2L, 2P, 3L, 3P, ..., 12L, 12P}?
L = leggeraP = pesante
Costo Computazionale
Il costo computazionale, o complessità, di un algoritmo è dato dalle funzioni che indicano il tempo impiegato dallo stesso per terminare e lo spazio di memoria che esso necessita per poter operare.
È evidente che le due funzioni T(n) (tempo) e S(n) (spazio) dipendono dalle operazioni da eseguire, dalla dimensione dell'input n e dalle caratteristiche dell'hardware su cui operano.
Inoltre, per evidenziare le fasce di complessità si prenderebbe in considerazione:
- caso pessimo
- caso medio
- caso ottimo
di cui il pessimo è il più interessante ed è il caso da tenere in considerazione nel proporre il miglioramento degli algoritmi.
2.1 Notazione Asintotica
Dato che T(n) e S(n) sono funzioni con l'assunzione di gesti diversi, usiamo le notazioni asintotiche per isolare problem studie.
2.1.1 Notazione Θ
Data una funzione f(n), si dice che f(n) si definisce Θ(g(n)) l'insieme:
Θ(g(n)) = {f(n) : ∃ c1, c2 > 0, ∀ n ≥ n0, c1g(n) ≤ f(n) ≤ c2g(n)}
cioè esistono delle costanti positive per cui la funzione risolve asintoticamente e comunque il problema.
4.3 ALBERO DI DECISIONE
Per risolvere dei problemi ci sono occasioni che possono dare risultati differenti secondo dell'input e della rigeneri delle variabili. Il campo dell'input diventa un campo lungo ciascuna strada e questo esempio viene chiamato il STRUNG sull'albero. L'albero aiuta risolvidando il problema che delle 12 numele. Quest'introduzione è una serie dei capircusi.
Questi alberi esistono diversi tipi:
4.3.1 ALBERI LIBERI
Gli alberi liberi sono alberi di cui nodi sono collegati liberamente, senza un ordine, basta che non si creino cicli. Un insieme di alberi liberi con nodi non tutti collegati fra loro viene detto foresta.
Questi alberi sono definiti anche come particoli grefici che sono un tipo di struttura che esoniscureno più divisi.
4.3.2 ALBERI RADICATI E ALBERI ORDINATI
Un albero radicato è un albero in cui c'è un nodo che si distingue dagli altri e è detto nodo radice.
Qualsiasi altro nodo dell'albero si dice che discende dalla radice e che la radice è un antecato di tutti i nodi dell'albero.
Ogni nodo può avere dei figli, e tutti i nodi che figlie sono detti anteriori, inoltre quelli che non ce l'hanno sono figli.
Si assume anche che c'è tra un nodo a radice dell'albero è detta profondità di un nodo, mentre la massima profondità che c'è tra un nodo e la radice è detta altezza dell'albero.
Intra un nodo di profondità l e il nodo ad esso collegato è di profondità l+1. E detto padre del nodo, che è padre dei figli o dei suoi nodo padre, due nodi con lo stesso padre sono detto fratelli.
La radice è l'unico nodo senza padre.
È chiaro che la scopo, nella progettazione di algoritmi, è la ricerca di un limite inferiore il chiudere du più possibile il divario dell'intesa.
Un esempio di applicazione di questo metodo lo abbiamo visto nello studio del problema delle 12 cuoiette.
4.4.1 ORACOLO
La teoria della complessità ci chiziano oracolo che, ln un procedimento, presenta continuamente quale passo, il caso pessimo possibile, che facendo ci porta a studiare le caso la problema proceduri.
Un metodo preciso per trovare l' ampiezza di problema con oracolo ueni, però ne avieranno guida nel abiltati, il problemi.
4.4.1 PROBLEMA DEL TORNEO
Problema del Torneo consiste nello stabilire, con il minor numero possibile di confronti tra i partecipanti, una competizione che eliminerne i più deboli e le pia forti, supponendo che ci ultriocuni concorrenti cite sia sempre meo uno ineressato (nella pratica, ciu uo I è sempre nero un uoi interese).
Trovare il primo è semplice: sono necessari n - 1 confronti di solamente ci sembra evidente duele chi sar si competicion e che sembrano Ix ptotenziale cuiunque vizino un algoritmo eui totti casi il massimo è coplique O(n) contontu.
Ma in un Torneo i confronti si disponeuo diresezionalmente:
Procedendo per pratica, ie avurea ci partecipanti, un 2k sappiamo che i giocatori si affronteranno in diverse fasi come segie:
- un primo turno da n/2 incontri
- un secondo turno n/4 incontri
- e cos via si ciu l'turn senza dove si si fa o solo incontro (n/2k=1) per stabiire il vincitore.
verifica facilmente che ie uncreo di piasta e piari di volti interni di un alcoro binarco che sono quello adichiusi cmu verificari il paragrafo 3.3.3, esianuando [l1...t4,n-1]. Abiquindi anche questo algoritmo è quariclo schiome la differenza sta zale punto che ciascun pariculpute ci pe' appuntusclusiva 2log n incontri e ciclo solo le campione um schice esd dclusine olog uo incontru ucu ...
Vq se ci interessese trovare anche il seondo?
6. ORDINAMENTO
Uno dei problemi più importanti nel mondo delle facoltà è quello dell’ordinamento: date e trattate a chiudere e di mettere alcuni dati occulti, secondo qualche criterio è sempre più problema vedremo di fare in maniera prassi più efficiente, a seconda dei casi.
N.B. Gli algoritmi saranno scritti in pseudo-codice, cioè, un codice simile, di quasi identica sintassi, da eseguire in modo analogo quindi con commenti utility e questa progressiva rallentando dell’implementatore che, per l’curribito quasi allo stesso si considerano unicamente le operazioni (ad esempio, considerare la nizia a come la posizione di inizio e quindi mettere il complesso iniziale a cornice da 
6.1 INSERTION SORT
Due vediamo come funziona l’algoritmo in un esempio.
Sia A un array di n elementi dato in input, l’output sarà l’array A ordinato.
→ 5 2 4 6 1 3
→ 2 5 4 6 1 3
→ 2 4 5 6 1 3
→ 2 4 5 6 1 3
→ 1 2 4 5 6 3
→ 1 2 3 4 5 6
Dall’esempio si può capire che il j-esimo elemento viene confrontato con gli nth più elevati e che la procedura ricercia row il suo posto e, è vero in volta si distribuivo delle posizioni.
6.1.1 ALGORITMO
INSERTIONSORT(A): // A = array di lunghezza u
for (j = 2; j ≤ u; j++) {
key = A[j]
i = j - 1
while ( i > 0 && A[i] > key )
A[i+1] = A[i];
i--;
}
A[i+1] = key