Esercizi di Algoritmi e Strutture Dati
|
|
|
- Angelina Pippi
- 9 anni fa
- Visualizzazioni
Transcript
1 Esercizi di Algoritmi e Strutture Dati Moreno Marzolla [email protected] Ultimo aggiornamento: 29 novembre Rotazioni semplici in ABR Si consideri l operazione di rotazione semplice applicata ad un Albero Binario di Ricerca (ABR). Dimostrare che l operazione di rotazione semplice, come definita a lezione, preserva la proprietà di ordinamento degli ABR. In altre parole, dimostrare che un ABR, dopo una singola operazione di rotazione semplice rispetto ad un qualsiasi nodo x, è ancora un ABR. Consideriamo la figura seguente: X Y Y T3 T1 X T1 T2 T2 T3 Supponiamo di effettuare una rotazione semplice verso destra, usando X come perno. Prima della rotazione, valgono le seguenti relazioni: Y X T 1 Y T 2 Y T 2 X T 3 X (dove per semplicità usiamo la notazione T 1 Y per indicare che per ogni nodo Z di T 1 vale la relazione Z Y ). È possibile verificare che tutte queste relazioni valgono anche nell albero di destra (quello ottenuto dopo la rotazione), che quindi è ancora un ABR. 1
2 2 Costruzione di ABR Dimostrare che qualsiasi algoritmo basato su confronti per la costruzione di un ABR con n nodi ha complessità asintotica Ω(n log n). Supponiamo che sia possibile costruire un ABR con n nodi, utilizzando confronti, in tempo strettamente inferiore a Ω(n log n). Ricordiamo che, dato un ABR con n nodi, è possibile ottenere la lista ordinata delle chiavi in esso contenute mediante una visita simmetrica (detta anche visita inordine) dell albero. La visita simmetrica ha costo Θ(n). Quindi, se potessimo costruire un ABR in tempo inferiore a Ω(n log n), riusciremmo anche a ordinare un insieme di n elementi, usando solo confronti, in tempo inferiore a Ω(n log n), il che è impossibile dato il limite inferiore alla complessità del problema dell ordinamento mediante confronti 3 Visita di un ABR L operazione di visita di un ABR con n nodi può essere implementata determinando l elemento minimo dell ABR, e poi invocando n 1 volte l operazione successor(). Fornire una giustificazione intuitiva del fatto che questo algoritmo di visita abbia complessità asintotica Θ(n). Ricordiamo l algoritmo per determinare il successore di un nodo algorithm successor(nodo v) -> nodo if (v == null) then return null; if (v.right!= null) then return min(v.right); p = v.parent while (p!= null && v == p.right) do v = p; p = v.parent; endwhile return p; dove la procedura min() determina il nodo con chiave minima in un albero radicato nel nodo v, ed è definita come algorithm min(nodo v) -> nodo while (v!= null && v.left!= null) do v = v.left; endwhile 2
3 return v; Se proviamo a visualizzare il comportamento dell operazione di visita implementata mediante determinazione dell elemento minimo seguita da n 1 invocazioni della procedura successor(), osserviamo che ciascun arco dell albero viene attraversato esattamente due volte: una volta in discesa, ad opera della procedura min(), e una volta in salita ad opera della procedura successor(), che nel ramo risale di figlio in padre fino alla prima svolta a destra. È anche importante osservare che una volta attraversato in discesa e in salita, un arco non viene più attraversato. Osserviamo anche che vengono eseguite O(1) operazioni elementari per ogni attraversamento di arco. A questo punto, osserviamo che un albero on n nodi ha esattamente n 1 archi (si dimostra per induzione, e vale per qualsiasi albero, non solo per alberi binari). Quindi il costo dell operazione di visita implementata come sopra è 2(n 1) = Θ(n). 4 Incremento di chiavi in un albero AVL Si consideri un albero AVL contenente n chiavi numeriche. Supponiamo che le chiavi siano tutte distinte tra loro. Vogliamo implementare l operazione incrementachiave(k, d) il cui scopo è quello di incrementare il valore della chiave k di una quantità d (che potrebbe anche essere negativa), facendolo diventare k + d. Al termine di questa operazione, la struttura dati risultante deve ancora essere un albero AVL. Per l ipotesi di unicità delle chiavi, il nodo contenente la chiave k, se esiste, è sempre unico; supponiamo anche che il valore k + d sia unico. Descrivere un algoritmo per realizzare l operazione incrementachiave(k,d), stimandone poi il costo computazionale. Esiste una soluzione banale, che consiste nel rimuovere il nodo con chiave k (che per ipotesi è unico) e inserire un nuovo nodo con chiave k + d. Il costo complessivo risulta essere O(log n). 5 Implementazione di un albero AVL A lezione abbiamo visto che per una corretta implementazione degli alberi AVL è necessario conoscere l altezza dei sottoalberi radicati in ciascun nodo. Infatti, questa informazione consente poi di capire quali sono i sottoalberi pesanti, e quindi procedere alle operazioni di ribilanciamento appropriate. Ricordiamo che l altezza di un albero è la massima profondità cui si trova una sua foglia. L albero composto da un singolo nodo (la radice) ha altezza Consideriamo innanzitutto un generico ABR (non bilanciato). Supponiamo che ciascun nodo v abbia un attributo intero v.h che corrisponde all altezza del sottoalbero radicato in v. Mostrare come sia possibile estendere le operazioni di inserimento e rimozione di nodi di un ABR per 3
4 mantenere in modo efficiente il valore corretto di v.h per ciascun nodo. Tale modifica non deve alterare il costo computazionale delle operazioni di inserimento e rimozione, che devono mantenersi O(h) nel caso pessimo, essendo h l altezza totale dell albero. 2. Consderiamo ancora un generico ABR. Dimostrare come l operazione di rotazione semplice può essere estesa per mantenere il valore corretto di v.h per ciascun nodo. Dopo tale modifica, il costo dell operazione di rotazione semplice deve essere O(h) nel caso pessimo, essendo h l altezza totale dell albero. 3. Usare i due punti precedenti per dimostrare come sia possibile mantenere l informazione sull altezza di ciascun sottoalbero in un albero AVL senza alterare il costo computazionale delle operazioni di inserimento e rimozione di nodi. Assumiamo che un oggetto nodo v abbia gli attributi seguenti: v.left riferimento al figlio sinistro (oppure null); v.right riferimento al figlio destro (oppure null); v.parent riferimento al padre (oppure null se v è la radice); v.h altezza dell albero radicato in v. Definiamo come prima cosa l algoritmo aggiusta_h(v). L algoritmo funziona come segue: assume che i figli del nodo v (se esistono) abbiano il valore corretto dell attributo h (quindi, assume di conoscere in maniera esatta l altezza dei sottoalberi radicati nei figli, sempre se non sono vuoti). In base a questa informazione, calcola il valore di v.h. algoritmo aggiusta_h(nodo v) if ( v.left == null && v.right == null ) then v.h = 0; if( v.left == null ) then v.right!= null v.h = v.right.h + 1; if( v.right == null ) then v.left!= null v.h = v.left.h + 1; v.h = max( v.left.h, v.right.h ) + 1; A questo punto è facile definire un altra procedura, che chiameremo aggiusta_h_ric che risale ricorsivamente da un nodo v fino alla radice dell albero, ricalcolando il valore dell attributo h di tutti i nodi visitati: 4
5 algoritmo aggiusta_h_ric(nodo v) while ( v!= null ) do aggiusta_h(v); v = v.parent; endwhile Ora siamo in grado di ricalcolare il valore di h in caso di inserimento o rimozione di nodi. Nel caso di inserimento in un ABR, sappiamo che il nuovo nodo venga inserito in una foglia v. Dopo l inserimento, chiamiamo semplicemente l operazione aggiusta_h_ric(v) che ricalcola tutte le altezze da v fino alla radice dell albero. Il costo complessivo è O(h) nel caso pessimo, essendo h l altezza dell albero. Nel caso di rimozione, è necessario distinguere i tre casi: Il nodo rimosso v era una foglia. Sia p il padre di v (se esiste). Dopo aver staccato v, si invoca aggiusta_h_ric(p) e l algoritmo termina. Il nodo rimosso v ha un unico figlio w. Sia p il padre di v. Il nodo w viene reso figlio di p (al posto di v, e si invoca l operazione aggiusta_h_ric(p). L algoritmo termina. Il nodo rimosso v ha due figli. Si individua il nodo predecessore w, il quale non ha figlio destro. Sia p il padre di w. È possibile rimuovere w attaccando il padre p all unico figlio di w. Il nodo w si sostituisce a v. A questo punto si invoca aggiusta_h_ric(p), essendo sicuri che nel cammino da p alla radice la procedura attraversa anche la posizione precedentemente occupata dal nodo v che è stato rimosso (posizione ora occupata da w). Nel caso della rotazione semplice, consideriamo il caso di rotazione semplice verso destra rispetto ad un nodo x. Si può eseguire la procedura seguente: x y t3 t1 t2 y = x.left; t1 = y.left; t2 = y.right; t3 = x.right; y.right = x; x.left = t2; x.right = t3; aggiusta_h_ric(x); 5
6 6 Attraversamento in-ordine iterativo Scrivere un algoritmo iterativo per effettuare la visita in-ordine di un albero binario (non necessariamente di ricerca). Per implementare l algoritmo di visita in-ordine facciamo uso di uno stack (pila). Gli elementi che inseriamo nello stack sono coppie < n, b >, essendo n un riferimento ad un nodo dell albero, e b un valore booleano che può essere true o false. algoritmo inordine-iter(nodo t) Stack S; S.push( <t, false> ); while (!S.empty()) do <n, f> := S.pop(); estrai <n,f> dallo stack if (f==true) then visita il nodo n; if (n.right!= null) then S.push( <n.right, false> ); S.push( <n, true> ); if (n.left!= null) then S.push( <n.left, false> ); endwhile L idea dell algoritmo è la seguente: ogni nodo n viene inizialmente inserito nello stack con flag settato a false. Quando un nodo v con flag settato a false viene estratto dallo stack, inseriamo prima il figlio destro, poi il nodo v con flag settato a true, e quindi il figlio sinistro. Quando estraiamo dallo stack un nodo con flag settato a true, è giunto il momento di visitare il nodo, che non verrà ulteriormente reinserito. 7 Albero inverso Dato un albero binario, i cui nodi contengono elementi interi, si scriva una procedura di complessità ottima per ottenere lalbero inverso, ovvero un albero in cui il figlio destro (con relativo sottoalbero) è scambiato con il figlio sinistro (con relativo sottoalbero). algoritmo inverti(nodo t) if (t == NULL) then 6
7 return; scambia i figli sinistro e destro Nodo tmp = t.left; t.left = t.right; t.right = tmp; inverti(t.left); inverti(t.right; L algoritmo viene inizialmente invocato passando come parametro un riferimento alla radice dell albero da invertire. 8 Cancellazione di nodi da ABR L operazione di cancellazione da un ABR commutativa? Nel senso che cancellare prima x e poi y, oppure cancellare prima y e poi x, produce lo stesso ABR? Consideriamo il seguente ABR Rimuovendo prima il valore 5, poi il valore 4 si ottiene il seguente ABR Se invece rimuoviamo prima il valore 4, poi il valore 5 si ottiene il seguente ABR
8 9 Verifica ABR (Questo esercizio è stato assegnato nella prova scritta del ) Si consideri un albero binario B in cui a ciascun nodo v è associata una chiave numerica (reale) v.key. Non ci sono chiavi ripetute, e tutte le chiavi appartengono all intervallo [a, b]. 1. Scrivere un algoritmo efficiente che dato in input l albero B e gli estremi a e b, restituisce true se e solo se B rappresenta un albero binario di ricerca. Non consentito usare variabili globali. 2. Calcolare il costo computazionale nel caso ottimo e nel caso pessimo dell algoritmo di cui al punto 1. Disegnare un esempio di albero che produce un caso pessimo, e un esempio di albero che produce il caso ottimo. Innanzitutto è utile ricordare che in un ABR i valori delle chiavi contenute nel sottoalbero sinistro di un nodo v sono tutti minori o uguali a v.key, mentre i valori delle chiavi contenute nel sottoalbero destro di v sono tutti maggiori o uguali di v.key. Una possibile soluzione è la seguente algoritmo checkabr(nodo v, float a, float b) -> bool if ( v == null ) then return true; return (a <= v.key && v.key <= b && checkabr(v.left, a, v.key) && checkabr(v.right, v.key, b) ); L algoritmo ricorsivo verifica che per ogni nodo v valgano le seguenti condizioni: a v.key; v.key b; il sottoalbero sinistro è un ABR con chiavi aventi valori in [a, v.key]; il sottoalbero destro è un ABR con chiavi aventi valori in [v.key, b]. Il costo nel caso ottimo è O(1), e si verifica quando la chiave presente nel figlio sinistro della radice di B viola la propriet di ABR; il costo nel caso pessimo è O(n) (essendo n il numero di nodi dell albero) e si verifica quando B è effettivamente un ABR; in tal caso l algoritmo controlla una ed una sola volta ogni nodo. 8
Esercizi di Algoritmi e Strutture Dati
Esercizi di Algoritmi e Strutture Dati Moreno Marzolla [email protected] Ultimo aggiornamento: 3 novembre 2010 1 Trova la somma/1 Scrivere un algoritmo che dati in input un array A[1... n] di n interi
Esercizi Capitolo 5 - Alberi
Esercizi Capitolo 5 - Alberi Alberto Montresor 23 settembre 2010 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile saltare alle
Esercizi Capitolo 6 - Alberi binari di ricerca
Esercizi Capitolo 6 - Alberi binari di ricerca Alberto Montresor 9 Agosto, 204 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile
Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.
Esercizio 1 E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1 livello 0 FB = -1 FB = -1 livello 1 FB = -1 livello 2 livello 3 L altezza è 3, il minimo si trova nel
In questa lezione Alberi binari di ricerca: la cancellazione
In questa leione Alberi binari di ricerca: la cancellaione 1 L algoritmo di Hibbard per cancellare (1962) Sia il nodo da cancellare: 1) è una foglia: si rimuove 2) ha un solo figlio x: si rende x figlio
Note per la Lezione 4 Ugo Vaccaro
Progettazione di Algoritmi Anno Accademico 2016 2017 Note per la Lezione 4 Ugo Vaccaro Ripasso di nozioni su Alberi Ricordiamo che gli alberi rappresentano una generalizzazione delle liste, nel senso che
LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve
LE STRUTTURE DATI DINAMICHE: GLI ALBERI Cosimo Laneve 1 argomenti 1. definizione di alberi e nozioni relative 2. implementazione degli alberi, creazione, visita 3. algoritmo di visita iterativa e sua implementazione
Alberi binari di ricerca
Alberi binari di ricerca Ilaria Castelli [email protected] Università degli Studi di Siena Dipartimento di Ingegneria dell Informazione A.A. 2009/20010 I. Castelli Alberi binari di ricerca, A.A. 2009/20010
Esercizi su alberi binari
Esercizi su alberi binari Esercizi svolti: Determinazione nodi contenti verifica completezza verifica quasi completezza lunghezza del cammino interno determinazione ultima foglia in un quasi completo verifica
Alberi ed Alberi Binari
Alberi ed Alberi Binari Il tipo di dato Albero Un albero è una struttura di data organizzata gerarchicamente. È costituito da un insieme di nodi collegati tra di loro: ogni nodo contiene dell informazione,
Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti
Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente,
Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti
Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor 27 marzo 2012 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente,
Alberi Binari di Ricerca
Alberi Binari di Ricerca Damiano Macedonio Università Ca' Foscari di Venezia [email protected] Original work Copyright Alberto Montresor, University of Trento (http://www.dit.unitn.it/~montreso/asd/index.shtml)
Alberi Binari di Ricerca
Alberi Binari di Ricerca Prof. G. M. Farinella [email protected] www.dmi.unict.it/farinella Riferimenti Bibliografici Cormen T.H., Leiserson C.E., Rivest R.L Introduction to Algorithms, Third Edition,
Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione
Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione Appello del 24 Gennaio 2007 Esercizio 1 (ASD) 1. Sia T (n) = T (n/6) + T (n/3) + Θ(n). Considerare ciascuna delle seguenti affermazioni
Algoritmi e Strutture Dati
Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 Il concetto di dato Il concetto di tipo di dato Insertion Sort for j 2 to lenght[a]
Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi
Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1 Dimostrare che un albero non vuoto con n nodi interni, dove ogni nodo interno ha almeno
Algoritmi e Strutture Dati. HeapSort
Algoritmi e Strutture Dati HeapSort Selection Sort: intuizioni L algoritmo Selection-Sort scandisce tutti gli elementi dell array a partire dall ultimo elemento fino all inizio e ad ogni iterazione: Viene
Problemi di ordinamento
Problemi di ordinamento Input: una sequenza di n numeri a 1, a 2,..., a n ; Output: una permutazione a 1, a 2,..., a n di a 1, a 2,..., a n tale che a 1 a 2... a n. Generalmente, la sequenza è rappresentata
Problem Set 2 docente: Luciano Gualà
Problem Set 2 docente: Luciano Gualà Esercizio 1 (equazioni di ricorrenza) Si risolvano le seguenti equazioni di ricorrenza. Si assuma sempre T (costante) = O(1). (a) T (n) = T (n 10) + 10. (b) T (n) =
Alberi Binari di Ricerca
Alberi Binari di Ricerca Algoritmi su gli alberi binari: visite Dato un puntatore alla radice di un albero vogliamo scandire in modo sistematico tutti i nodi di tale albero In una lista abbiamo una unica
Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree
Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1 Si definisca Interval Tree un albero binario di ricerca le
Gli ordini di visita di un albero binario di 9 nodi sono i seguenti: A, E, B, F, G, C, D, I, H (anticipato)
Alberi Indovina l albero Gli ordini di visita di un albero binario di 9 nodi sono i seguenti: A, E, B, F, G, C, D, I, H (anticipato) B, G, C, F, E, H, I, D, A (posticipato) B, E, G, F, C, A, D, H, I (simmetrico).
Alberi e alberi binari I Un albero è un caso particolare di grafo
Alberi e alberi binari Un albero è un caso particolare di grafo È costituito da un insieme di nodi collegati tra di loro mediante archi Gli archi sono orientati (ogni arco esce da un nodo origine ed entra
Lezione 7 Alberi binari: visite e alberi di ricerca
Lezione 7 Alberi binari: visite e alberi di ricerca Informatica 6 Maggio 2015 Operazioni sugli alberi: visita La visita di un albero esplora tutti i nodi ed esegue una qualche operazione su di essi. Per
Problemi, istanze, soluzioni
lgoritmi e Strutture di Dati II 2 Problemi, istanze, soluzioni Un problema specifica una relazione matematica tra dati di ingresso e dati di uscita. Una istanza di un problema è formata dai dati di un
Esercizi svolti a lezione
Esercizi svolti a lezione Problema 1 In un corso di laurea sono previsti un certo numero di esami obbligatori. Esistono inoltre dei vincoli di propedeuticità: se un esame A è propedeutico ad un esame B
Lezione 9 Alberi binari di ricerca
Lezione 9 Alberi binari di ricerca Rossano Venturini [email protected] Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 1 Lista monodirezionale Scrivere
Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione
Alberi Strutture dati: Alberi Strutture gerarchiche di dati Esempi Il file system di un sistema operativo L organigramma di un azienda Alberi generali, alberi n-ari, alberi binari, Ogni nodo ha un unico
Multi-way search trees
Multi-way search trees GT. 10.4 1 Argomenti Multi-way search trees Multi-way searching 9 (2,4) Trees 2 5 7 10 14 2 1 Alberi Binari di Ricerca Bilanciati n numero di chiavi (entry(key,elem)) AVL tree log(
Esercizi Capitolo 6 - Alberi binari di ricerca
Esercizi Capitolo 6 - Alberi binari di ricerca Alberto Montresor 23 settembre 200 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile
Esercitazione 6. Alberi binari di ricerca
Esercitazione 6 Alberi binari di ricerca Struttura base Rappresentabile attraverso una struttura dati concatenata in cui ogni nodo è un oggetto di tipo struttura Ogni nodo contiene: campo chiave (key)
Dati e Algoritmi I (Pietracaprina) Esercizi su Priority Queue e Heap
Dati e Algoritmi I (Pietracaprina) Esercizi su Priority Queue e Heap g Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1 Si definisca un albero ternario completo di altezza h come un albero con
Alberi Bilanciati di Ricerca
Alberi Bilanciati di Ricerca Damiano Macedonio Uniersità Ca' Foscari di Venezia [email protected] Copyright 2009, 2010 Moreno Marzolla, Uniersità di Bologna (http://www.moreno.marzolla.name/teaching/asd2010/)
GLI ALBERI BINARI DI RICERCA. Cosimo Laneve
GLI ALBERI BINARI DI RICERCA Cosimo Laneve argomenti 1. alberi binari di ricerca 2. la ricerca di elementi e la complessità computazionale 3. operazione di cancellazione di elementi 4. esempi/esercizi
Cammini minimi fra tutte le coppie
Capitolo 12 Cammini minimi fra tutte le coppie Consideriamo il problema dei cammini minimi fra tutte le coppie in un grafo G = (V, E, w) orientato, pesato, dove possono essere presenti archi (ma non cicli)
