Esercizio 17terremoto forte recente in un albero di ricerca
In questa pagina 5
Testo (scritti del 19/09/2023 e del 04/09/2024, seconda parte, esercizio 2, 7 punti; compare anche in un esempio di tema d'esame). Il Dipartimento della Protezione Civile vuole aggiornare la classificazione sismica del territorio italiano, in base all'intensità e frequenza dei terremoti del passato. Per farlo utilizza un albero binario di ricerca , che implementa una mappa le cui entry sono coppie , dove (la chiave) rappresenta un istante di tempo in cui è avvenuto un terremoto, e (il valore) rappresenta l'intensità del terremoto. Per ogni nodo esiste un campo v.max che riporta la massima intensità dei terremoti rappresentati dalle entry di (sottoalbero con radice ). Si progetti un algoritmo ricorsivo TerremotoForteRecente (TFR) che, dati un tempo e un valore di intensità , restituisce yes se c'è stato un terremoto di intensità in un istante di tempo , altrimenti restituisce no.
(a) Spiegare l'idea alla base dell'algoritmo, aiutandosi con un esempio numerico. (b) Specificare chiaramente l'input e l'output dell'algoritmo. (c) Scrivere l'algoritmo in pseudocodice. (d) Analizzare la complessità dell'algoritmo del punto precedente.
(a) Idea
Si cerca una entry con e (vedi Alberi binari di ricercaAlbero binario di ricerca come albero binario proprio con entry nei nodi interni e foglie vuote; inorder crescente; TreeSearch; get, put e remove (due casi, con predecessore inorder) in Theta(h); altezza fino a n-1; esempi di inserimenti; alberi aumentati con campi size e max e algoritmi di conteggio e interrogazione in O(h).Alberi binari di ricerca →). La struttura aiuta in due modi:
- ordine delle chiavi: in un nodo con chiave , se allora e tutto il suo sottoalbero sinistro hanno chiavi e vanno scartati; si prosegue solo a destra. Se , tutto il sottoalbero destro ha chiavi e quindi basta il suo
max; - campo
max: sev.maxnessuna entry di può avere intensità , e si scarta tutto il sottoalbero in tempo costante.
Esempio. Le entry sono , , , , , inserite in questo ordine: radice ; figli e ; ha figli e . I campi max sono: , , , , radice .
- TFR: radice:
max; la chiave ma il valore : si prova a sinistra. Nodo :max; chiave , si va solo a destra. Nodo :max; chiave , si va a destra: foglia vuota, no. Tornati alla radice si prova a destra (nodo ):max, no. Risultato: no (il terremoto di intensità è avvenuto al tempo ). - TFR: radice nodo (chiave , solo a destra) nodo : chiave e valore : yes.
(b) Input e output
Input: un nodo di (alla prima chiamata la radice; null/foglia esterna per il sottoalbero vuoto), un tempo , un'intensità . Output: yes se contiene una entry con chiave e valore , no altrimenti.
(c) Pseudocodice
Algoritmo TFR(v, t, i)
Input: nodo v di T (null se il sottoalbero è vuoto), tempo t, intensità i
Output: yes se in T_v c'è una entry (t', i') con t' >= t e i' >= i, no altrimenti
if v = null OR v.max < i then return no
if v.key >= t then
if v.value >= i then return yes
if TFR(v.left, t, i) = yes then return yes
return TFR(v.right, t, i)Chiamata: TFR(T.root(), t, i). Correttezza (induzione sull'altezza di ): se è vuoto o v.max la risposta è no; altrimenti, se , stesso è una entry valida quando ; il sottoalbero sinistro può contenere chiavi (si cerca ricorsivamente); il destro ha tutte le chiavi e si cerca ricorsivamente. Se , né né il suo sottoalbero sinistro possono contenere chiavi e si cerca solo a destra.
(d) Complessità
Sia l'altezza di . I nodi in cui l'algoritmo prosegue "a cavallo" di formano un unico cammino dalla radice (a sinistra quando , a destra quando ). Da ciascun nodo del cammino con parte una seconda chiamata sul figlio destro, che ha tutte le chiavi :
- se il suo
maxè la chiamata termina subito con no in ; - altrimenti nel sottoalbero esiste una entry valida, e la discesa lungo i nodi con
max(controllo del valore, poi a sinistra se ilmaxdi sinistra è , altrimenti a destra) la trova restituendo yes dopo al più passi; quando ciò accade tutta la ricorsione termina.
In totale operazioni, ciascuna . La complessità è : se l'albero è bilanciato, nel caso pessimo di albero a catena. (Verificato su 500 alberi casuali confrontando il risultato con la ricerca esaustiva.)
Errori comuni
- Visitare tutto l'albero () senza sfruttare né l'ordine né
max. - Usare solo il campo
maxe ignorare la condizione sul tempo (si restituirebbe yes per un terremoto troppo vecchio). - Cercare nel sottoalbero sinistro quando (inutile) o dimenticare di cercare a sinistra quando e .
- Non specificare cosa fa l'algoritmo su un sottoalbero vuoto.
Versione ripasso
Testo. ABR con entry (istante, intensità), campo v.max = massima intensità in . TFR(t, i) = yes se esiste un terremoto con intensità al tempo . Idea con esempio, input/output, pseudocodice, complessità.
- Idea (vedi Alberi binari di ricercaAlbero binario di ricerca come albero binario proprio con entry nei nodi interni e foglie vuote; inorder crescente; TreeSearch; get, put e remove (due casi, con predecessore inorder) in Theta(h); altezza fino a n-1; esempi di inserimenti; alberi aumentati con campi size e max e algoritmi di conteggio e interrogazione in O(h).Alberi binari di ricerca →): se si va solo a destra; se il sottoalbero destro è tutto ; se si scarta il sottoalbero.
- Esempio: entry ; = no, = yes.
- Pseudocodice:
v = nullov.max < i⇒ no; sev.key >= t:v.value >= i⇒ yes,TFR(left)= yes ⇒ yes; infinereturn TFR(right). - Complessità: un cammino a cavallo di più al più una discesa che termina con yes: .
- Esempio completo:
maxdei nodi: , , , , radice . : radice (, valore ) ⇒ sinistra: nodo (, solo a destra) ⇒ nodo (, destra vuota) ⇒ no; poi destra: nodo conmax⇒ no. : nodo ha chiave e valore ⇒ yes. - Perché serve
max: senza di esso, per decidere su bisognerebbe guardarne tutte le entry (); conmaxun sottoalbero tutto nell'intervallo di tempo si scarta o si accetta in (semaxlo si scarta, altrimenti esiste certamente una entry valida e la discesa la trova). - Input e output: input nodo , tempo , intensità ; output yes/no; sottoalbero vuoto ⇒ no.
- Errori: visitare tutto l'albero; ignorare il tempo; cercare a sinistra quando .