07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure lelemento non è presente nella sequenza stessa. In generale una sequenza di elementi si può realizzare come un array e la scansione avviene usando un indice. Se la sequenza non è ordinata a priori occorre eseguire una ricerca lineare o sequenziale. Se la sequenza è ordinata è opportuno eseguire una ricerca binaria.
07/04/2003Algoritmi Ricerca binaria Lalgoritmo di ricerca lineare richiede che al più tutti gli elementi dellarray vengano confrontati con la chiave. Se lelemento viene trovato prima di raggiungere la fine della sequenza non sarà necessario proseguire la ricerca. Se la sequenza su cui occorre effettuare la ricerca è ordinata si può usare un algoritmo di ricerca molto più efficiente che cerca la chiave sfruttando il fatto che gli elementi della sequenza sono già disposti in un dato ordine. Esempi di sequenze ordinate: elenco telefonico, agenda, etc. In questi casi si usa un algoritmo di ricerca binaria che è più efficiente perché riduce lo spazio di ricerca.
07/04/2003Algoritmi Ricerca binaria 1. Confronta la chiave con lelemento centrale della sequenza, 2. Se la chiave è uguale allelemento centrale, allora la ricerca termina positivamente, 3. Se invece la chiave è maggiore dellelemento centrale si effettua la ricerca solo sulla sottosequenza a destra, 4. Se invece la chiave è minore dellelemento centrale dello spazio di ricerca, si effettua la ricerca solo sulla sottosequenza a sinistra.
07/04/2003Algoritmi La ricerca stile dizionario (3) Ogni volta elimino la metà delle schede, oppure mi fermo perché ho trovato la scheda cercata Ogni volta divido il numero N delle schede per 2, mi fermo quando N è diventato 1 o 0 Al più eseguo x passi dove x è il logaritmo in base 2 di N Scheda cercata!
07/04/2003Algoritmi Ricerca binaria Inizialmente la ricerca è fatta su N elementi, dove N indica la lunghezza della sequenza (lo spazio di ricerca ha dimensione N). Ad ogni iterazione lo spazio della ricerca si riduce di circa la metà. Potremmo dire che si passa da N ad N/2. Il caso peggiore si ha quando lelemento cercato non si trova nella sequenza (non esiste un elemento uguale alla chiave). Nel caso peggiore, literazione viene eseguita log 2 N volte.
07/04/2003Algoritmi Liste ordinate Una lista di n oggetti confrontabili (a 0, a 1, a 2, … a n-1 ) si dice ordinata quando a i <= a i+1 per ogni i=0,… n-2 Per ordinare una lista si deve costruire una nuova lista permutando gli elementi in modo che sia soddisfatta la condizione indicata
07/04/2003Algoritmi Ordinare un array Considereremo inizialmente algoritmi che operano su dati contenuti in un array di n elementi oppure sui prima n elementi di un array di dimensioni maggiori Input: a1,a2,...,an Output: a'1,a'2,...,a'n permutazione (riarrangiamento) di a1,a2,...,an tale che a'1 a'2... a'n.
07/04/2003Algoritmi algoritmo di ordinamento selection-sort Idea: Dato l array: v[0],…,v[n-1] - cercare lelemento minimo dellarray; - scambiarlo con lelemento v[0], a meno che v[0] stesso non sia già il minimo; - ordinare larray v[1],…,v[n-1], dato che lelemento v[0] è già nella sua posizione definitiva.
07/04/2003Algoritmi Algoritmo di ordinamento bubblesort Idea: - leggere larray v[0],…,v[n-1], da sinistra a destra, confrontando tra di loro ogni coppia di elementi contigui, e, se questi non sono in ordine tra di loro, scambiarli di posto; - a fine lettura lelemento massimo si troverà al posto n-1;* - se non si sono effettuati scambi, larray è già ordinato, altrimenti ordinare con lo stesso metodo larray v[0],…,v[n-2]. * Infatti ad ogni confronto, qualunque elemento segua il massimo sarà minore di questo, e quindi verrà scambiato.
07/04/2003Algoritmi Algoritmo di ordinamento quicksort Idea: - scegliere un elemento dellarray a caso (es. il mediano, cioè quello nella posizione mediana, cioè con indice p=[(n-1)/2)]; - sia v[p]=x - ordinare parzialmente tutti gli altri elementi rispetto al mediano, cioè produrre larray: v[0],…,v[h-1], v[h],…,v[n-1]. dove tutti gli elementi in rosso sono minori di x e quelli in azzurro sono maggiori o uguali di x; - ripetere lo stesso procedimento sugli array, se hanno lunghezza >1: v[0],…,v[h-1] e v[h],…,v[n-1].
07/04/2003Algoritmi Un algoritmo ottimo di ordinamento (ma non in loco): mergesort Idea: - dividere larray dato in metà, cioè in due array v[0],…,v[(n-1)/2],v[(n- 1)/2+1],…,v[n-1]; - ordinare i due array separatamente; - unire i due array ordinati in un unico array t[0],…,t[n-1] (operazione detta merge). Algoritmo di merge: - scorrere larray v[0],…,v[(n-1)/2], con un indice i e contemporaneamente scorrere larray v[(n-1)/2+1],…,v[n-1] con un indice j, confrontando ad ogni passo v[i] e v[j]; il minore tra i due elementi sarà inserito in sequenza in un array t di servizio.