Anteprima
Vedrai una selezione di 1 pagina su 4
Algoritmi e strutture dati - esercizi Pag. 1
1 su 4
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

Algoritmi e Strutture Dati

&

Laboratorio di Algoritmi e Programmazione

— Appello del 30 Giugno 2009 —

Esercizio 1 - ASD 2

1. Sia T (n) = 4T (n/2)+n +3n. Considerare ciascuna delle seguenti affermazioni e dire se è corretta o no. Giustificare

la risposta.

(a) T (n) = Ω(n)

3

(b) T (n) = O(n )

(c) T (n) = O(n lg n)

2. Sia T (n) = T (n/6) + T (n/3) + n. Verificare usando il metodo di sostituzione la correttezza della seguente

affermazione. T (n) = O(n lg n)

Esercizio 2 - ASD

Si consideri il seguente array A=[14,5,12,9,7,8,24,6,10,5] e lo si trasformi applicando l’algoritmo BuildMaxheap.

Esercizio 3 - ASD

1. Si sviluppi un algoritmo che, dato un albero generale T rappresentato tramite gli attributi: e

fratello, figlio

e un intero k > 0, calcola il numero dei nodi di grado k presenti inT . (Ricordiamo che il grado di un nodo di

padre

un albero è pari al numero dei suoi figli.)

2. Si dimostri la correttezza dell’algoritmo proposto.

Esercizio 4 - ASD

Sia T un albero R/B. Per ciascuna delle seguenti affermazioni dire se essa è vera o falsa. Giustificare la risposta.

• L’operazione di inserimento di una nuova chiave in T ha complessità logaritmica nel numero dei nodi di T .

• L’operazione di ricerca di una chiave in T ha complessità logaritmica nel numero dei nodi di T .

• Per ogni nodo x di T, su ogni cammino da x alla radice esiste almeno un nodo rosso.

• Per ogni nodo x di T, su ogni cammino da x ad una foglia esiste lo stesso numero di nodi neri.

Esercizio 1 (Laboratorio)

Date le classi StackArray (che realizza uno stack con un array) e QueueArray (che realizza una coda con un array)

sviluppate durante il corso, si richiede di completare l’implementazione dei due metodi della seguente classe:

import Queues.QueueArray;

import Stacks.StackArray;

public class Esercizio1 {

// pre: S non nullo

// post: scambia l’ordine del primo e dell’ultimo elemento

// presenti nello stack S, lasciando inalterati tutti

// gli altri elementi. Se S contiene meno di due elementi

// allora rimane inalterato

public static void scambiaS(StackArray S) {...}

// pre: Q non nulla

// post: scambia l’ordine del primo e dell’ultimo elemento

// presenti nella coda Q, lasciando inalterati tutti

// gli altri elementi. Se Q contiene meno di due elementi

// allora rimane inalterata

public static void scambiaQ(QueueArray Q) {...}

}

È possibile utilizzare strutture dati di appoggio solo di tipo StackArray e solo se strettamente necessarie.

Esercizio 2 (Laboratorio)

Data la definizione:

Un nodo n di un albero binario si dice nodo sinistro se è figlio sinistro di suo padre. Si dice invece nodo

destro se è figlio destro di suo padre. La radice è un nodo a parte, cioè non è né sinistro né destro.

Si consideri il package BinTrees sviluppato durante il corso e relativo agli alberi binari. Si richiede di aggiungere alla

classe BinaryTree l’implementazione del seguente metodo:

// post: ritorna la differenza tra il numero di nodi sinistri e il numero

// di nodi destri dell’albero

public int nodiSxmenoDx() {...}

Il metodo deve essere lineare rispetto al numero di nodi dell’albero.

Se necessario, è possibile utilizzare metodi privati di supporto.

********************** classe StackArray *************************************

package Stacks;

public class StackArray implements Stack {

private static final int MAX=100; // dimensione massima dello stack

private Object[] S; // lo stack

private int head; // puntatore al top dello stack

// post: costruisce uno stack vuoto

public StackArray() {

S = new Object[MAX];

head = -1;

}

// post: ritorna il numero di elementi nello stack

public int size() {

return head +1;

}

// post: ritorna lo stack vuoto

public void clear() {

head = -1;

}

// post: ritorna true sse lo stack e’ vuoto

public boolean isEmpty() {

return (head == -1);

}

// post: ritorna true sse la coda e’ piena

public boolean isFull() {

return (head == MAX -1);

}

// pre: stack non vuoto!

// post: ritorna l’oggetto in cima allo stack

public Object top() {

return S[head];

}

// post: inserisce ob in cima allo stack

public void push(Object ob) {

if (isFull())

return;

S[++head] = ob;

}

// pre: stack non vuoto!

// post: ritorna e rimuove l’elemento in cima allo stack

public Object pop() {

return S[head--];

}

}

********************** classe QueueArray *************************************

package Queues;

public class QueueArray implements Queue {

private static final int MAX=100; // dimensione massima della coda

private Object[] Q; // la coda

private int head; // puntatore al primo elemento in coda

private int tail; // puntatore all’ultimo elemento della coda

// post: costruisce una coda vuota

public QueueArray() {

Q = new Object[MAX];

head = 0;

tail = 0;

}

// post: ritorna il numero di elementi nella coda

public int size() {

return tail - head;

}

// post: ritorna true sse la coda e’ vuota

public boolean isEmpty() {

return (head == tail);

}

// post: ritorna true sse la coda e’ piena

public boolean isFull() {

return (tail - head == MAX);

}

// post: svuota la coda

public void clear() {

head = 0;

tail = 0;

}

Dettagli
Publisher
A.A. 2012-2013
4 pagine
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher cecilialll di informazioni apprese con la frequenza delle lezioni di Algoritmi e strutture dati e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli studi di Napoli Federico II o del prof Sansone Carlo.