Next: About this document ...
Seconda Provetta
ASD1 2002-2003
Exercise 2
Si consideri una foresta di alberi gestita
da una famiglia di guardiaboschi.
All'inizio la foresta non contiene alcun albero.
I guardiaboschi eseguono, in sequenze arbitrarie,
operazioni delle seguenti 3 tipologie.
- 1.
- impianto: impiantare un nuovo albero fatto di un solo
nodo senza discendenza;
- 2.
- diversificazione:
individuare due alberi e della stessa specie
(ossia con radici aventi lo stesso numero di figli),
sradicare ed innestarne la radice
come figlio diretto della radice di ;
- 3.
- potatura:
la potatura è un'operazione ricorsiva.
Dato un nodo in un albero,
indichiamo con il papà di ,
ossia il nodo in cui risulta innestato come figlio.
Potar via un nodo
significa
staccare da il sottoalbero radicato in
ed innestarlo direttamente nel terreno,
ed inoltre,
se si era già visto
potar via un figlio antecedentemente a ,
da quando
si trova innestato come figlio del suo papà
,
allora la potatura si applica ricorsivamente
a .
Con riferimento al precedente esercizio,
sapresti dimostrare
che in un qualsiasi momento,
ed ove sia un qualsiasi nodo di albero
della nostra foresta con, diciamo, figli,
allora la cardinalità della discendenza di ,
ossia il numero di nodi del sottoalbero radicato in ,
è almeno .
Exercise 3
Sapresti dare uno pseudocodice od una descrizione comunque
efficace e formale dell'operazione di EstraiMinimo
(e Consolida) relativa ad uno Heap di Fibonacci?
Sapresti indicare il costo reale nel caso peggiore
e sapresti tracciare l'analisi ammortizzata?
Exercise 4
Agli archi di un grafo
sono associate delle lunghezze
(valori numerici non negativi).
Abbiamo cioè una funzione
.
Inoltre viene indicato un nodo sorgente
.
Vorremo valutare la distanza
per ogni nodo in
, ossia la minima lunghezza
di un cammino da
a
.
Poggiando su uno heap di servizio (preso come black-box),
si dia uno pseudocodice per l'algoritmo
di Dijkstra che computa le distanze
da un dato
nodo sorgente
a tutti gli altri nodi,
ma anche i cammini ottimi (si utilizzi un array di predecessori
),
qualora le lunghezze degli archi siano tutte
non negative.
Nello pseudocodice,
i nodi siano colorati bianco, grigio e nero,
secondo il seguente schema:
- bianco
- se non si è ancora individuato un cammino
da al nodo in questione;
- grigio
- se si è già individuato qualche cammino
da al nodo in questione ,
ma non è stato ancora
estratto dallo heap di servizio;
- nero
- il nodo in questione è già stato
estratto dallo heap di servizio.
Dimostrare poi le seguenti invarianti:
- 1.
- ad ogni iterazione,
ad uno specifico passo della tua procedura
da te indicato, puoi affermare che i nodi
grigi sono tutti e soli i nodi nello heap di servizio;
- 2.
- sempre,
;
- 3.
- quando è nero, allora
.
Exercise 5
Con riferimento al precedente esercizio,
sapresti fornire lo pseudocodice di una procedura
che, dato un nodo
, e sulla base del vettore
dei predecessori
come computato dall'algoritmo di
Dijkstra,
restituisca un cammino ottimo da
a
in tempo lineare nella lunghezza del cammino stesso?
Sapresti condurre l'analisi del running time nel caso
peggiore evidenziando inoltre le differenze
qualora lo heap sia sato realizzato
come Heap Binomiale o come Heap di Fibonacci?
Exercise 6
Sapresti dare uno pseudocodice od una descrizione comunque
efficace e formale dell'algoritmo RadixSort
che usi come algoritmo intermedio il CountingSort
preso come black-box?
Sapresti indicare il tempo di calcolo nel caso peggiore e migliore?
Riesci ad individuare una invariante di ciclo?
Se al posto del CountingSort utilizzi un altro
algoritmo di ordinamento,
l'output resta comunque corretto?
(Fornire eventuale controesempio).
Next: About this document ...
Romeo Rizzi
2002-11-15