• Non ci sono risultati.

Esame I.A. 10 settembre 2020

N/A
N/A
Protected

Academic year: 2021

Condividi "Esame I.A. 10 settembre 2020"

Copied!
4
0
0

Testo completo

(1)

Esame I.A. 10 settembre 2020

Soluzioni

1 Esercizio 1

Trovare limiti superiori e inferiori per la seguente equazione di ricorrenza:

T (n) =

T  1 10 n



+ T  5 6 n



+ T  1 16 n



+ n n > 1

1 n ≤ 1

Soluzione È facile vedere che T (n) = Ω(n) a causa della parte non ricorsiva. Proviamo quindi a dimostrare che T (n) = O(n):

• Caso base: per n = 1, T (1) = 1 ≤ c − b, ovvero c ≥ b + 1;

• Ipotesi induttiva: T (n

0

) ≤ cn

0

, ∀n

0

< n ;

• Passo induttivo:

T (n) = T  1 10 n



+ T  5 6 n



+ T  1 16 n

 + n

≤ 1

10 cn + 5

6 cn + 1

16 cn + n

= 24 + 200 + 15

240 cn

= 239 240 cn

≤ cn

L’ultima disequazione è vera per c ≥ 240, abbiamo quindi dimostrato che T (n) = O(n). Ne consegue che T (n) = Θ(n).

2 Esercizio 2

Siete stati appena assunti nel settore IT dell’università, con il compito di monitorare lo stato dei servizi offerti dall’ateneo. Purtroppo, c’è in corso una pandemia ed il perfetto funzionamento dei servizi infor- matici è fondamentale per consentire agli studenti di seguire i corsi da remoto.

1

(2)

Il servizio di classi virtuali e di videoconferenza è stato realizzato utilizzando un grande numero di macchine interconnesse tra di loro, al fine di migliorare l’accessibilità al servizio. Purtroppo, il software utilizzato per implementare tale servizio è tale per cui se una macchina non risulta raggiungibile sulla rete interna, l’intero servizio non funziona.

Realizzate un programma in python, il più efficiente possibile, che permetta, dato lo stato della rete interna, di determinare se una o più macchine non sono raggiungibili, a causa ad esempio di un col- legamento interrotto. La rete può essere rappresentata come un grafo pesato indiretto, in cui i pesi sugli archi rappresentano la banda passante del collegamento. Un peso pari a zero indica un collegamento non funzionante.

Nel caso in cui il vostro programma identifichi la presenza di un problema, restituire un insieme di collegamenti che è possibile riparare per consentire al sistema di tornare a funzionare.

Soluzione Il sistema funziona se tutti i nodi sono raggiungibili, quindi se il grafo è tale per cui esiste un’unica componente connessa—un arco con peso zero è un arco “non percorribile” nella costruzione delle componenti connesse.

Pertanto, si può applicare l’algoritmo di ricerca delle componenti connesse su un grafo. Se il numero di componenti connesse è maggore di 1, allora c’è un partizionamento nella rete. In questo caso, oc- corre concentrarsi su tutti gli archi che sono stati incontrati che hanno peso zero—si noti che non viene richiesto l’insieme minimo di archi, bensì un generico insieme di archi.

Una possibile implementazione in python è:

c l a s s G r a p h :

def _ _ i n i t _ _ ( s el f ):

s e l f . n o d e s = { }

def V ( s e l f ):

r e t u r n s e lf . n o d e s . k e y s ()

def _ _ l e n _ _ ( s e l f ) :

r e t u r n len ( s e l f . n o d e s )

def adj ( self , u ):

if u in s e l f . n o d e s : r e t u r n s e lf . n o d e s[ u]

def w e i g h t ( self , u , v ) : r e t u r n s e lf . n o d e s [u] [ v ]

def i n s e r t N o d e ( self , u ):

if u not in s e l f . n o d e s : s e l f . n o d e s[ u] = { }

def i n s e r t E d g e ( self , u , v , w= 0 ) : s e l f . i n s e r t N o d e ( u )

s e l f . i n s e r t N o d e ( v ) s e l f . n o d e s [u] [ v ] = w s e l f . n o d e s [v] [ u ] = w

def c c D F S ( self , c o m p o n e n t s , comp , u , a d d _ e d g e s ):

c o m p o n e n t s [u] = c om p for v in g r a p h . adj ( u ):

if c o m p o n e n t s [v] = = 0 :

if g r a p h . w e i g h t ( u , v ) = = 0 :

2

(3)

a d d _ e d g e s . a p p e n d ([ u , v ]) e l s e :

g r a p h . c c D F S ( c o m p o n e n t s , comp , v , a d d _ e d g e s )

def i s C o n n e c t e d ( s e l f ) : c o m p o n e n t = 0 c o m p o n e n t s = { } a d d _ e d g e s = [ ]

for u in g r a p h . V () : c o m p o n e n t s [ u] = 0

for u in g r a p h . V () :

if c o m p o n e n t s [u] = = 0 :

c o m p o n e n t = c o m p o n e n t + 1

g r a p h . c c D F S ( c o m p o n e n t s , c o m p o n e n t , u , a d d _ e d g e s )

if c o m p o n e n t = = 1 : r e t u r n True , N o n e r e t u r n False , a d d _ e d g e s

Questa implementazione può essere testata su due grafi, di cui uno solo connesso, come segue:

# C o n n e c t e d g r a p h = G r a p h ()

for u , v , w in [ ( ’ a ’, ’ b ’, 3 ) , ( ’ a ’, ’ d ’, 2 ) , ( ’ b ’, ’ c ’, 5 ) , ( ’ c ’, ’ d ’, 9 ) , ( ’ c ’ , ’ e ’ , 1 ) , (’ d ’ , ’ e ’, 1 )] :

g r a p h . i n s e r t E d g e ( u , v , w )

c o n n e c t e d , e d g e s = g r a p h . i s C o n n e c t e d () if not c o n n e c t e d :

p r i n t (" L i n k s to r e p a i r : " , e d g e s )

# Not c o n n e c t e d g r a p h = G r a p h ()

for u , v , w in [ ( ’ a ’, ’ b ’, 0 ) , ( ’ a ’, ’ d ’, 0 ) , ( ’ b ’, ’ c ’, 5 ) , ( ’ c ’, ’ d ’, 9 ) , ( ’ c ’ , ’ e ’ , 0 ) , (’ d ’ , ’ e ’, 0 )] :

g r a p h . i n s e r t E d g e ( u , v , w )

c o n n e c t e d , e d g e s = g r a p h . i s C o n n e c t e d () if not c o n n e c t e d :

p r i n t (" L i n k s to r e p a i r : " , e d g e s )

Poiché il programma proposto si basa su una DFS, il suo costo sarà O(V + E).

3 Quiz

Si consideri il seguente programma per individuare l’elemento minimo all’interno di una lista singolarmente concatenata. Quale dei seguenti confronti deve essere inserito all’interno del programma, per completarlo?

c l a s s N o d e :

def _ _ i n i t _ _ ( self , v , n= N o n e ) : s e l f . val = v

s e l f . n e x t = n

3

(4)

def g e t _ m i n ( h e a d ) : c u r r = he a d

m i n i m u m = h e a d . val

w h i l e c u r r . n e x t is not N o n e : c u r r = cu r r . n e x t

if _ _ _ _ _ _ _ _ _ _ _ _ _ : m i n i m u m = c u r r . val r e t u r n m i n i m u m

• curr < minimum X curr.val < minimum

• curr.val <= minimum

• curr.val > minimum

Un uomo vuole andare in diversi posti nel mondo. Li ha elencati tutti, ma ci sono alcuni posti che vuole visitare prima di altri posti. Quale algoritmo può usare per determinare il corretto ordine in cui visitare tutti i posti?

• Depth First Search

• Breadth First Search

• Algoritmo di Dijikstra X Ordinamento topologico

Dato il seguente grafo, qual è il peso del minimo albero ricoprente se si utilizza l’algoritmo di Prim a partire dal nodo a?

X 27 • 39

• 38 • 28

4

Riferimenti

Documenti correlati

Ci sono poche evidenze circa un incremento Ci sono poche evidenze circa un incremento ponderale e una crescita lineare maggiori in ponderale e una crescita lineare maggiori in

Sovraffollamento e condizioni inadeguate di vita dettate dall’eccessiva densità dei luoghi di detenzione sono solo due degli aspetti drammatici su cui porre l’attenzione, anche se

272: si tratta del più aggiornato studio monografico sulla figura dell’architetto ticinese (Muggio, Canton Ticino 1739 - Gorgonzola, 1818), il quale fu attivo in

● L’atomicità però può essere interrotta quando una write tenta di agire su una pipe (quasi) piena e quindi l’operazione viene completa in più fasi.  In presenza di

Grafo particolare è quello &#34;euleriano&#34;, dal matematico Eulero, che nel 1736 lo utilizzò per risolvere il problema dei ponti di Königsberg: un cammino o percorso è detto di

Per ogni x `e qundi definita una clique e per ogni clique esiste un x che la definisce.. Quindi tale colore

• La visita in ampiezza fa uso di una coda per memorizzare tutti i nodi adiacenti al nodo v visitato, che portano ad un nodo non marcato come scoperto. • I nodi raggiungibili

‰ eventi causalmente legati nello spazio e/o nel tempo (inizio/fine di un’operazione, un trasporto, una giacenza in magazzino)... Corso di Ricerca