Domande Risolte
Domande Risolte
MANIEZZO
2. L’analisi asintotica serve per ottenere una stima del tempo di esecuzione
per input molto grandi, considerando i dettagli implementativi
per ogni input, considerando i dettagli implementativi
per input molto grandi, astraendo i dettagli
per input molto piccoli, astraendo i dettagli
per input molto piccoli, considerando i dettagli implementativi
1
7. La notazione Ω-grande si usa
nella valutazione del costo computazionale di un algoritmo nel caso ottimo
nella valutazione del costo computazionale di un algoritmo nel caso medio
nella valutazione del costo computazionale di un algoritmo nel caso pessimo
per determinare limiti inferiori di complessità di problemi computazionali
9. n2 + n/3 + n log n é
O(n)
O(n2)
O(n log n)
o(n2)
o(n)
10. n(n-1)/2 è
O(n)
O(n2)
O(nlog(n))
o(n3)
o(n)
2
13. n2 + n/3 + n log(n) è
Ω(n)
Ω(n2)
Ω(n log(n))
Θ(n2)
Θ(n)
14. n(n-1)/2 è
Ω(n)
Ω(n2)
Ω(n2log(n))
Θ(n2)
Θ(n)
3
19. Se f(n) è o(g(n)) allora possiamo dire che
il limite per n che va all’infinito di f(n)/g(n) = 0
il limite per n che va all’infinito di f(n)/g(n) = costante maggiore di 0
niente
il limite per n che va all’infinito di f(n)/g(n) è più infinito
il limite per n che va all’infinito di f(n)/g(n) è finito
il limite per n che va all’infinito di f(n)/g(n) non esiste
4
26. L’approccio divide et impera ha il seguente costo computazionale:
sempre polinomiale
sempre esponenziale
dipende dal problema
non si può dire in anticipo
5
30. Insertion-sort ordina un vettore A[1,..,n]
ordinando ricorsivamente i sottovettori A[1,q], A[q+1,n], dove q e circa n/2, e costruendo un
nuovo vettore ordinato dato dalla loro unione
selezionando ad ogni ciclo l’elemento minimo della porzione di vettore non ancora ordinata
A[j,...,n] per metterlo nella posizione j
selezionando ad ogni ciclo l’elemento massimo della porzione di vettore non ancora ordinata
A[1,...,i] per metterlo nella posizione i
mantenendo un heap nella prima parte A[1,...,i] del vettore, scambiando ad ogni ciclo la radice
dello heap con l’elemento in posizione i
mantenendo un vettore ordinato A[1,...,j-1] nel quale ad ogni ciclo viene aggiunto l’elemento j-
esimo del vettore
31. Merge-sort (nella versione dei lucidi presentati a lezione) è un algoritmo
stabile
non stabile
32. Heap-sort (nella versione dei lucidi presentati a lezione) è un algoritmo
stabile
non stabile
33. Quick-sort (nella versione dei lucidi presentati a lezione) è un algoritmo
stabile
non stabile
34. Insertion-sort (nella versione dei lucidi presentati a lezione) è un algoritmo
stabile
non stabile
35. Merge-sort (nella versione dei lucidi presentati a lezione) è un algoritmo
in place
non in place
dipende dall’implementazione
36. Heap-sort (nella versione dei lucidi presentati a lezione) è un algoritmo
in place
non in place
dipende dall’implementazione
37. Quick sort (nella versione dei lucidi presentati a lezione) è un algoritmo
in place
non in place
dipende dall’implementazione
6
39. Merge-sort nel caso pessimo ha costo computazionale
O(n log(n))
O(n2)
o(n2)
o(n log(n))
o(n3)
7
46. Ricercare un numero in un vettore ha complessità computazionale
Θ (n log(n))
Θ (n2)
o(n2)
O(n log(n))
Θ(n)
47. Ricercare un numero in un vettore ordinato ha complessità computazionale
Θ(log(n))
Θ(n2)
o(n2)
O(n log(n))
Θ(n)
48. Dato un vettore di n elementi nel quale si devono fare k ricerche, con k < log n
conviene fare le ricerche senza ordinare il vettore
conviene ordinare il vettore prima di fare le ricerche
conviene ordinare il vettore dopo aver fatto le ricerche
49. Dato un vettore non ordinato di n elementi nel quale si devono fare k ricerche
conviene sempre ordinare il vettore prima di fare la ricerca
se k > n conviene fare le ricerche senza ordinare il vettore
se k = n conviene ordinare il vettore dopo aver fatto le ricerche
se k > n conviene ordinare il vettore prima di fare le ricerche
non conviene mai ordinare il vettore
50. Che costo computazionale ha ricercare il massimo in una priority queue?
Θ(n)
Θ(1)
Θ(log(n))
Dipende dalla implementazione
51. Che costo computazionale ha ricercare il massimo in una priority queue implementata con un
vettore non ordinato?
Θ(n)
Θ(1)
Θ(log(n))
52. Che costo computazionale ha ricercare il massimo in una priority queue implementata con un
vettore ordinato?
Θ(n)
Θ(1)
Θ(log(n))
8
53. Che costo computazionale ha ricercare il massimo in una priority queue implementata con un
heap?
Θ(n)
Θ(1)
Θ(log(n))
54. Che costo computazionale ha estrarre il massimo in una priority queue implementata con un
vettore non ordinato?
Θ(n)
Θ(1)
Θ(log(n))
55. Che costo computazionale ha estrarre il massimo in una priority queue implementata con un
vettore ordinato?
Θ(n)
Θ(1)
Θ(log(n))
56. Che costo computazionale ha estrarre il massimo in una priority queue implementata con un heap?
Θ(n)
Θ(1)
Θ(log(n))
57. Che costo computazionale ha inserire un elemento in una priority queue implementata con un
vettore non ordinato?
Θ(n)
Θ(1)
Θ(log(n))
58. Che costo computazionale ha inserire un elemento in una priority queue implementata con un
vettore ordinato?
Θ(n)
Θ(1)
Θ(log(n))
59. Che costo computazionale ha inserire un elemento in una priority queue implementata con un
heap?
Θ(n)
Θ(1)
Θ(log(n))
60. Che costo computazionale ha la procedura Build-heap?
θ (n)
θ(1)
θ (n log n)
Altro
θ (n2)
9
61. Che costo computazionale ha la procedura Heapify?
Θ(n)
Θ(1)
Θ(n log(n))
Θ(n2)
Altro
62. Che costo computazionale ha la procedura Partition usata da Quick-sort?
Θ(n)
Θ(1)
Θ(n log(n))
Θ(n2)
Altro
63. Che costo computazionale ha Quick-sort nel caso medio?
Θ(n)
Θ(1)
Θ(n log(n))
Θ(n2)
Altro
64. E possibile ordinare n numeri in tempo o(nlog(n)) ?
Dipende dalle proprietà dell’input
Per input generali no
si, sempre
si, ma nel caso medio
65. Per algoritmi comparison sort esiste un limite inferiore di complessità (caso pessimo, input
generali) pari a
Ω(n)
Ω(1)
Ω(nlog(n))
Ω(n2)
10
68. Quali operazioni possono essere eseguite in una priority queue ?
Estrazione massimo
Inserimento
Ordinamento
11
76. Il costo computazionale della procedura Heapify è
Θ(n)
Θ(1)
Θ(log(n))
nessuna delle precedenti
77. Il costo computazionale per estrarre il massimo in una priority queue implementata con un heap e
O(n)
O(1)
O(log(n))
Θ(n)
78. Il costo computazionale per inserire un elemento in una priority queue implementata con un heap e
O(n)
O(1)
O(log(n))
Θ(n)
79. Cosa e un algoritmo comparison sort?
un algoritmo per ordinare in tempo lineare
un algoritmo per ordinare che confronta i numeri tra di loro
un algoritmo per ordinare il cui output dipende solo dall’esito di confronti tra numeri
80. Un algoritmo di ordinamento si dice stabile se
funziona sempre anche quando ci sono malfunzionamenti hardware
produce un output in cui se due elementi uguali dell’input erano in un certo ordine vi rimangono
funziona senza usare memoria aggiuntiva oltre a quella usata per memorizzare linput
funziona senza usare memoria aggiuntiva oltre a quella usata per memorizzare l’input e l’output
81. Un algoritmo di ordinamento ordina in place se
funziona sempre anche quando ci sono malfunzionamenti hardware
produce un output in cui se due elementi uguali dell’input erano in un certo ordine vi rimangono
-
funziona senza usare memoria aggiuntiva oltre a quella usata per memorizzare l’input
funziona senza usare memoria aggiuntiva oltre a quella usata per memorizzare l’input e l’output
12
84. E possibile calcolare l’i-esimo elemento nell’ordinamento partendo da un vettore non ordinato in
tempo lineare
Si
No
Dipende
Si, ma solo se i valori sono monotoni
85. In una pila gli elementi vengono estratti utilizzando una politica
LIFO
FIFO
TIFO
SCHIFO
86. In una coda gli elementi vengono estratti utilizzando una politica
LIFO
FIFO
TIFO
SCHIFO
87. Qual e il problema nell’usare i vettori per implementare code e pile?
non posso avere strutture dati di dimensioni maggiori della memoria presente nel calcolatore in
uso
devo indirizzare gli elementi usando gli indici del vettore
non posso avere strutture dati di dimensioni maggiori di quelle definite in fase di
programmazione
le operazioni di ordinamento e selezione sono computazionalmente molto costose
88. In una doubly linked list cancellare un elemento (fornito tramite un puntatore) costa
O(n)
O(n log(n))
O(1)
89. In una singly linked list cancellare un elemento (fornito tramite un puntatore) costa
O(n)
O(nlog(n))
O(1)
90. Ricercare un elemento in una singly linked list ordinata costa
O(n)
O(log(n))
O(1)
91. Ricercare un elemento in una doubly linked list ordinata costa
O(n)
O(log(n))
O(1)
13
92. In una doubly linked list inserire un elemento (fornito tramite un puntatore) costa
O(n)
O(nlog(n))
O(1)
93. In una doubly linked list ordinata inserire un elemento (fornito tramite un puntatore) costa
O(n)
O(nlog(n))
O(1)
94. In una coda implementata tramite doubly linked list ENQUEUE costa
O(n)
O(nlog(n))
O(1)
95. In una coda implementata tramite doubly linked list DEQUEUE costa
O(n)
O(nlog(n))
O(1)
96. In una coda implementata tramite doubly linked list con sentinelle DEQUEUE costa
O(n)
O(n log n)
O(1)
97. In una pila implementata tramite doubly linked list PUSH o POP costano
O(n)
O(nlog(n))
O(1)
hanno costi diversi
98. Come posso rappresentare alberi generali tramite liste?
ogni nodo ha un puntatore al padre, al figlio sinistro ed alla lista dei fratelli
ogni nodo ha un puntatore per ogni figlio ed uno al padre
la radice ha un puntatore per ogni foglia ed ogni foglia ha un puntatore alla radice
ogni nodo ha un puntatore al padre ed uno al fratello destro
99. Come posso rappresentare alberi binari più semplicemente che con la rappresentazione per gli
alberi generali?
ogni nodo ha un puntatore al padre, al figlio sinistro ed alla lista dei fratelli
ogni nodo ha un puntatore per ogni figlio ed uno al padre
la radice ha un puntatore per ogni foglia ed ogni foglia ha un puntatore alla radice
ogni nodo ha un puntatore al padre ed uno al fratello destro
100. Perché si implementano le liste usando le sentinelle?
perché così facendo si diminuisce il costo computazionale
perché il codice risulta più semplice e pulito
perché e necessario farlo
14
101. In una tabella hash con indirizzamento diretto le operazioni di inserimento, ricerca e cancellazione
hanno un costo computazionale
costante
lineare
logaritmico
quadratico
102. In una tabella hash con funzione hash h, la chiave i viene memorizzata in posizione
i
h(i)
ih(i)
all'inizio della tabella
103. Una buona funzione hash deve
minimizzare le collisioni
minimizzare lo spazio di memoria che serve per essere calcolata
massimizzare le collisioni
essere veloce da calcolare
15
109. Usando il metodo di chaining nella gestione dei conflitti
una tabella con m posizioni può contenere al massimo m elementi
una tabella con m posizioni può contenere più di m elementi
112. Il costo computazionale per la ricerca di un elemento in una tabella hash dove le collisioni vengono
gestite con la tecnica di chaining nel caso pessimo è
θ(numero di elementi presenti nella tabella)
θ(1 + load factor)
θ(load factor + dimensione della tabella)
θ(load factor + numero di elementi presenti nella tabella)
113. Il costo computazionale per la ricerca di un elemento in una tabella hash dove le collisioni vengono
gestite con la tecnica di chaining nel caso medio con simple uniform hashing e n=O(m), cioe il
numero di elementi inseriti proporzionale alle dimensioni d
O(n)
O(nlog(n))
O(1)
114. Per avere uniform hashing, nota la probabilità Pr(k) di ogni chiave, la somma delle probabilità delle
chiavi che collidono (∑ Pr(k) per ogni k t.c. h(k)=j) deve essere
uguale alla somma delle probabilità delle altre chiavi che collidono: se m e la dimensione della
tabella ∑ Pr(k) = 1/m
uguale alla media delle probabilità: se n e il numero di chiavi che collidono ∑ Pr(k)=∑ Pr(k)/n
uguale alla probabilità massima delle chiavi che collidono: ∑ Pr(k)=max(Pr(k))
non e un valore che influisce sull’uniform hashing
115. Nella progettazione di funzioni hash che godano di uniform hashing se non sono note a priori le
probabilità delle chiavi Pr(k)
non e possibile usare una funzione hash per indirizzarle
si usano delle euristiche facendo dipendere h da tutti i bit di k cercando di mantenere
indipendenza da pattern particolari
si può usare solo una funzione h(k)=k
16
si usano delle euristiche facendo dipendere h da eventuali pattern presenti nelle chiavi
116. Data una chiave k ed una tabella di dimensione m il Metodo della divisione prevede una funzione
hash
h(k) = k
h(k) = k mod m
h(k) = Parte_Intera_Inferiore[m(kA mod m)]
h(k) = Parte_Intera_Inferiore[km]
nessuna delle precedenti
117. In una hash table con gestione delle collisioni tramite open addressing
il load factor non può mai essere maggiore di 1
il load factor non può mai essere minore di 1
il load factor può anche essere maggiore di 1
118. In una hash table (uniform hashing) con gestione delle collisioni tramite open addressing la
lunghezza media di una probe
1/(1 - load factor)
1 + load factor
load factor
dimensione della tabella + 1
120. la ricerca di un elemento in un albero binario di ricerca con n nodi di altezza h ha un costo
computazionale
O(n)
O(log(n))
O(h)
O(log(h))
O(nlog(h)
121. l’inserimento di un elemento in un albero binario di ricerca con n nodi di altezza h ha un costo
computazionale
O(n)
O(log(n))
O(h)
O(log(h))
O(nlog(h))
17
122. la cancellazione di un elemento in un albero binario di ricerca con n nodi di altezza h ha un costo
computazionale
O(n)
O(log(n))
O(h)
O(log(h))
O(nlog(h)
127. Quali delle seguenti affermazioni relative alla programmazione dinamica sono vere?
Lo stesso sottoproblema può essere risolto più volte
Ogni sottoproblema viene risolto una sola volta e il risultato memorizzato in una tabella
La soluzione di un sottoproblema viene memorizzata per un certo lasso di tempo e poi viene
rimossa dalla tabella
18
129. Dire se la seguente affermazione è una condizione necessaria per applicare la programmazione
dinamica: una soluzione ottima per il problema contiene al suo interno le soluzioni ottime dei
sottoproblemi.
VERO
FALSO
dipende
131. Tutti i problemi di ottimizzazione possono essere risolti efficientemente con la programmazione
dinamica.
vero
falso
tutti, ma solo quelli che godono della proprietà cumulativa
132. Tutti i problemi di ottimizzazione possono essere risolti efficientemente con l'approccio divide et
impera
VERO
FALSO
Tutti, ma solo quelli che godono della proprietà di divisionalità
135. il seguente algoritmo per il problema del commesso viaggiatore è un algoritmo greedy? Parto dalla
città numero 1 e procedo visitando la città più vicina non ancora visitata. Quando tutte le città sono
state visitate torno alla città numero 1.
si
no
dipende
solo se le distanze sono euclidee
solo se le distanze sono non-negative
19
136. Esiste un algoritmo greedy per risolvere il commesso viaggiatore?
si
no
non si sa
137. E vero che, come nel caso della programmazione dinamica, anche per applicare un algoritmo
greedy occorre che la soluzione ottima contenga le soluzioni ottime dei sottoproblemi?
si
no
dipende
139. I problemi di ottimizzazione che soddisfano la proprietà della sottostruttura ottima possono essere
risolti con algoritmi greedy
vero
falso
dipende
140. I problemi di ottimizzazione che soddisfano la proprietà della sottostruttura ottima possono essere
risolti con la programmazione dinamica
vero
falso
dipende
141. I problemi di ottimizzazione che soddisfano la proprietà della sottostruttura ottima possono essere
risolti sia con algoritmi greedy che con la programmazione dinamica
vero
falso
dipende
20
143. L’approccio della programmazione dinamica ha il seguente costo computazionale:
sempre polinomiale
sempre esponenziale
dipende dal problema
nessuno dei precedenti
21
149. La funzione Union(x,y) per gli insiemi disgiunti
unisce gli insiemi x e y in un unico insieme x ∪ y
crea un nuovo insieme contenente x e y
verifica se x e y sono insieme disgiunti, se non lo sono li unisce
unisce gli elementi degli insiemi che contengono x e y, S e T rispettivamente, nell'unico insieme
S∪T
unisce l'elemento x agli elementi dell'insieme y
152. In un up-tree
la radice è l'elemento più basso e la ricerca avviene verso l'alto
la radice contiene il rappresentante di un insieme, che è padre di se stesso
le foglie puntano direttamente alla radice
ogni elemento contiene un campo chiave e un puntatore al padre
ogni elemento punta solo al padre
22
155. Il rango (rank) associato ad ogni nodo x di un up-tree rappresenta
il numero di figli di x
il limite superiore all'altezza di x
il limite superiore al numero di archi del cammino più lungo fra x e una foglia discendente
il numero complessivo di discendenti di x
il numero di antenati di x
158. Se i=log*(n)
i è tale per cui F(i) = n
i è il più piccolo intero tale che F(i)≥ n
i è il più piccolo intero tale che log log ... log(n)≥ 1, log ripetuto i volte
i è il più piccolo intero tale che log log ... log(n)≤ 1, log ripetuto i volte
i è il più piccolo intero tale che log log ... log(i)≤ 1, log ripetuto n volte
23
161. L'inversa della funzione di Ackerman α(m,n), per m≥ n, è definita come
α(m,n)=1/A(m,n))
α(m,n)=i se i è il più piccolo intero tale per cui A(i,floor(m/n)) > log(n)
α(m,n)=i se i è il più piccolo intero tale per cui A(i,floor(m/n)) > n
α(m,n)=i se i è il più piccolo intero tale per cui A(m,n) > n
α(m,n)=i se i è il più piccolo intero tale per cui A(floor(m/n)) < log(n)
163. Dato una foresta di up-tree, una sequenza di m operazioni make-set, union e find-set, con n
operazioni make-set, puo' essere eseguita in tempo
O(A(m,n))
O(m log* n)
O(α(m,n))
O(2n)
O(A(m,log* n))
164. Un grafo G è
una rete di connessione di nodi
un insieme di archi e vertici
un insieme di nodi collegati
una rappresentazione cartesiana di una funzione
una coppia di insiemi V e E
24
167. Il grado di un vertice v di un grafo è
il numero di archi che è necessario percorrere per andare dalla radice a v
il numero di figli di v
il numero di vertici connessi da un arco con v
il numero di vertici adiacenti a v
il numero di nodi di G
25
173. Un sottografo G* di un grafo G=(V,E) è
un sottinsieme dei vertici e degli archi di G
un grafo che ha tutti i vertici in V ma solo un sottinsieme degli archi in E
un grafo che ha tutti gli archi in E ma solo un sottinsieme dei vertici in V
un sottinsieme connesso del grafo G
un grafo contenente solo i vertici più bassi del grafo G
175. Un albero è
un grafo in cui è possibile identificare un nodo radice e dei nodi foglia
un sottografo connesso massimale di un grafo G=(V,E)
un sottografo connesso di un grafo G=(V,E) in cui è possibile identificare un nodo radice e dei
nodi foglia
un insieme di cammini di un grafo G=(V,E)
un grafo connesso senza cicli
178. Lo spazio necessario per rappresentare tutte le liste di adiacenza di vertici di un grafo G=(V,E) con
|V|=n e |E|=m è
θ(n)
θ(m+n)
θ(n log m)
non polinomiale
O( )
26
179. Una matrice di adiacenza per un grafo G=(V,E) è
una matrice delle liste di adiacenza di tutti i vertici in V
una matrice che elenca, per ogni vertice v in V, i vertici adiacenti a v
una matrice che specifica le adiacenze del grafo G
una matrice M di variabili intere, in cui M[i,j] è pari al j-esimo vertice adiacente al nodo i
una matrice M di variabili booleane con una cella per ogni coppia di vertici, M[i,j]=1 sse l'arco
{i,j} è nel grafo
180. Lo spazio necessario per contenere la matrice di adiacenza di un grafo G con n nodi è
O(n2)
Θ (n log n)
Θ(n2)
O(n log n)
O(n)
183. Durante una ricerca BFS lo stato assumibile da ciascun vertice puo' essere
non espanso, espanso ma non scoperto, scoperto
espanso, coperto, scoperto
coperto, scoperto, completo
interno, esterno, completo
non scoperto, scoperto ma non espanso, espanso
27
185. Durante una ricerca BFS l'etichetta di ogni vertice v corrisponde a
il minimo numero di archi che è necessario percorrere per andare da s a v
l'identificativo della componente connessa di v
il numero di archi nel cammino da s a v
la lunghezza del cammino più breve da s a v
il rango di v
189. Il sottografo G'=(V',È) dei predecessori costruito dalla procedura BFS applicata ad un grafo G a
partire da una sorgente s
è un grafo contenente tutti i vertici raggiungibili da s tale per cui per ogni v ∈ V' il cammino da s
a v è il cammino minimo da s a v in G
è un grafo contenente tutti i nodi esplorati da BFS durante la ricerca e tale per cui {u,v}∈ È sse
u,v ∈ V'
è un grafo contenente tutti i nodi esplorati da BFS durante la ricerca e tale per cui {u,v}∈ È sse
esiste un cammino da s a v e da s a u in G
è un albero contenente tutti i vertici raggiungibili da s tale per cui per ogni v ∈ V' il cammino da s
a v è il cammino minimo da s a v in G
è un albero contenente tutti gli antenati di ogni vertice v, cosi' come identificati dalla procedura
BFS quando applicata a G
28
percorre l'intero grafo G in ordine di valori ascendenti delle chiavi associate ai nodi
193. Al termine della procedura DFS applicata ad un grafo G=(V,E) ogni nodo v ∈ V ha associato
niente
una etichetta: la lunghezza del cammino minimo da s a v
una etichetta: il tempo di visita di v
una etichetta: il tempo di fine
due etichette: tempo di visita e tempo di fine
195. Il sottografo dei predecessori G'=(V',È) costruito dalla procedura DFS applicata a un grafo G
costituisce l'albero dei cammini minimi dalla sorgente s ad ogni nodo v di V
costituisce l'albero dei cammini minimi dalla sorgente s ad ogni nodo della componente
connessa di G in cui si trova s
costituisce un cammino minimo dalla sorgente s ad ogni nodo v di V
forma una foresta di sottoalberi DF
forma un albero DF
29
197. Durante la procedura DFS i vertici grigi
formano un albero binario, implementabile come una heap binomiale
formano una catena lineare, implementabile come uno stack
formano un ciclo, implementabile come uno stack
formano un sottoalbero dei predecessori, implementabile come una heap di Fibonacci
formano un sottografo generico di G, implementabile con una matrice di adiacenza
199. Il teorema del cammino bianco asserisce che in una foresta DFS di un grafo G=(V,E) un vertice v è
discendente di un vertice u sse
al tempo f[u] il vertice v è raggiungibile da u con un cammino di soli archi bianchi
al tempo d[u] il vertice v è raggiungibile da u con un cammino di soli archi bianchi
al tempo f[v] il vertice v è raggiungibile da u con un cammino di soli archi bianchi
al tempo d[v] il vertice v è raggiungibile da u con un cammino di soli archi bianchi
al tempo f[v] esiste un cammino di archi bianchi che connette u a v
200. a seguito dell'applicazione di una DFS ad un grafo G gli archi di G possono essere classificati come
archi:
bianchi, neri e grigi
red e black
dell'albero, all'indietro, in avanti, di attraversamento
all'indietro, in avanti e diagonali
dell'albero, in avanti, di backtrack
30
203. Un DAG può essere utilizzato per:
rappresentare cammini minimi su reti stradali
rappresentare precedenze fra eventi
memorizzare alberi DFS
identificare componenti connesse
memorizzare pagine su disco rigido
208. In un DAG che rappresenta le relazioni di precedenza fra attività associate ai nodi, l'esistenza di un
arco (u,v) significa che
l’attività u può iniziare solo quando v è completata
esiste una relazione di ordinamento topologico fra u e v
l’attività v può iniziare solo quando u è completata
l’attività v non può iniziare prima dell’attività u
le attività u e v devono iniziare insieme
31
209. Il tempo di CPU dell'ordinamento topologico di un DAG G=(V,E) è
uguale a quello di DFS(G)
O(V)
O(V log E)
O(E log V)
O(V+E)
210. Per la dimostrazione di correttezza dell'ordinamento topologico di un DAG G=(V,E) si dimostra che
il tempo di CPU di Topological-Order(G) è O(V+E)
se (u,v) ∈ E allora f[u] < f[v]
l'ordinamento topologico è transitivo rispetto all'ordinamento parziale indotto dal DAG
se (u,v) ∈ E allora f[u] > f[v]
se u ∈ V e v ∈ V allora (u,v) ∈ E
32
215. Se due vertici u e v sono in una stessa componente fortemente connessa allora
nessun cammino esce da questa CFC
nessun cammino fra loro esce da questa CFC
nessuna altra componente connessa contiene u e v
esiste una CFC che contiene sia u che v
u appartiene al grafo G e v al trasposto di G
218. In un grafo orientato G=(V,E) l'avo φ(u) di un qualunque u in V in una qualunque visita in
profondità' di G è
un antenato di u
il padre di u
il padre del padre di u
la radice dell'albero DFS (o BFS nel caso di ricerca in ampiezza)
nessuno dei casi precedenti
219. In ogni visita in profondità di un grafo orientato G=(V,E), per ogni vertice u in V i vertici u e φ(u)
sono visitati in tempi successivi
sono vertici espansi
sono vertici esplosi
appartengono alla stessa DFS
appartengono alla stessa CFC
220. In un grafo orientato G=(V,E) due vertici u e v in V appartengono alla stessa CFC sse
sono entrambi vertici bianchi
sono espansi a turno
hanno lo stesso padre
hanno lo stesso avo in una visita in profondità di G
nessuno dei precedenti
33
221. La correttezza della procedura strongly-connected-components(G) viene dimostrata
per ricorsione
per assurdo
per induzione
per deduzione
per caso
per infrazione
34
227. Per provare la correttezza dell'algoritmo di kruskal applicato a un grafo G=(V,E) si considera una
partizione del grafo G'=(V,È) corrente in due componenti non connesse G1 e G2 e si prova che
l'unione di G1 e G2 fornisce l'albero di copertura cercato
(V,È ∪ e), e arco di costo minimo che unisce G1 e G2, è un sottografo di qualche MST
il grafo G'\G1 ∪ G2 è un sottografo della MST cercata
(V,È ∪ e), e arco di costo minimo che unisce G1 e G2, è un MST
(V,È ∪ e), e arco di costo minimo che unisce G1 e G2, è un sottografo di G
35
233. La complessità in tempo dell'algoritmo di Prim è
O(E + V log V)
O(E log* E)
Θ(V log E)
Θ(E log V)
O(E log E)
234. Il problema dei cammini minimi con sorgente singola, dato un grafo G=(V,E) con pesi w:E->R e un
vertice s ∈ V, richiede di trovare
per ogni arco e ∈ E il cammino di peso minimo originato in s e passante per e
per ogni vertice v ∈ V il cammino di peso minimo da s a v
per ogni peso w il cammino più breve di peso w originato in s
per ogni vertice v ∈ V tutti i cammini originati in s che terminano in v
per ogni CFC di G, il cammino di peso minimo che connette s alla CFC
235. Il problema dell'individuazione dei cammini minimi con sorgente singola su un grafo G=(V,E) puo'
essere esteso a comprendere
l'individuazione del cammino minimo fra una coppia di vertici u e v
l'individuazione del cammino minimo fra due CFC
l'individuazione del cammino minimo fra ogni coppia di archi in E
l'individuazione del cammino minimo fra una sorgente s ∈ V ed ogni altro vertice in V
l'individuazione dei cammini minimi fra tutte le coppie di vertici in V
236. L'individuazione dei cammini minimi con sorgente singola sul grafo G=(V,E) può essere effettuata
sotto l'ipotesi che
non esistano in G componenti fortemente connesse di peso negativo
non esistano in G archi di peso negativo
non esistano in G vertici di peso negativo
non esistano in G cicli di peso negativo
non esistano in G cammini di peso negativo
237. La rappresentazione interna dei cammini nel problema dell'individuazione dei cammini minimi con
sorgente singola è analoga a quella
delle CFC
delle heap di Fibonacci
delle heap binomiali
degli MST
degli alberi BFS
238. Nella rappresentazione interna dei cammini minimi, per ogni vertice v ∈ V viene mantenuto
un predecessore π(v)
un figlio φ(v)
un puntatore alla sorgente σ(v)
un grafo G(v)
non so
36
239. L'individuazione dei cammini minimi con sorgente singola s sul grafo G=(V,E) comporta
l'individuazione di un albero dei cammini minimi Gπ=(Vπ, Eπ) in cui
Vπ è l'insieme dei vertici raggiungibili da s in G
per ogni v ∈ Vπ l'unico cammino semplice da s a v in Gπ è il cammino minimo da s a v in G
per ogni v ∈ Vπ l'unico cammino semplice da s a v in Gπ è un cammino minimo da s a v in G
Gπ forma un albero con radice in v
per ogni e ∈ Eπ l'unico cammino semplice da s a v in Gπ è il cammino minimo passante per e
243. La correttezza dell'algoritmo di Dijkstra, applicato ad un grafo orientato e pesato G=(V,E) e sorgente
s, si prova dimostrando che
l'algoritmo termina in un tempo di CPU che è O(V2)
al termine dell'esecuzione è possibile raggiungere ogni vertice v ∈ V a partire da S
al termine dell'esecuzione l'algoritmo ha individuato cio' che doveva individuare
al termine dell'esecuzione si ha d[u]=δ(s,u) per ogni u ∈ V
l'asserto della correttezza di Dijkstra è rispettato per ogni possibile s ∈ V
37
244. La complessità computazionale dell'algoritmo di Dijkstra è
O(E2)
O(V2 + E)
O(V log E)
O(V2)
O(V2 log E)
38
250. Nel caso di un DAG è possibile calcolare i cammini minimi sfruttando
un ordinamento lineare dei vertici di G
un ordinamento quadratico dei vertici di G
un ordinamento crescente dei vertici di G
un ordinamento topologico dei vertici di G
un ordinamento binario dei vertici di G
252. Il problema dei cammini minimi fra tutte le coppie, dato un grafo pesato G=(V,E,W), richiede di
trovare per ogni coppia u,v ∈ V il minimo costo di un cammino da u a v
trovare per ogni coppia u,v ∈ E il minimo costo di un cammino da u a v
trovare per ogni coppia u,v ∈ V il minimo costo di un cammino da s a v passante per u
trovare per ogni coppia u,v ∈ V il minimo costo di un cammino da s a u passante per v
trovare per ogni arco (u,v) ∈ E il minimo costo di un cammino da s passante per (u,v)
253. La matrice dei predecessori π={πuv} calcolata assieme ai cammini minimi fra tutte le coppie di un
grafo G=(V,E) è tale per cui
πuv è NIL se non c'è un cammino da u a v, altrimenti è un puntatore a un predecessore di v su di
un cammino minimo da u
πuv è NIL se u=v, altrimenti è un puntatore a un predecessore di v su di un cammino minimo da
u
πuv è NIL se u=v o se non c'è un cammino da u a v, altrimenti è un predecessore di v su di un
cammino minimo da u
πuv è NIL se u=v o se non c'è un cammino da u a v, altrimenti è un predecessore di v su di un
cammino minimo in G
39
256. L'algoritmo di Floyd-Warshall
è un algoritmo di programmazione dinamica
è un algoritmo greedy
è un algoritmo approssimato
è un algoritmo euristico
è un algoritmo ottimo
261. I problemi decisionali sono la classe di problemi dove per ogni possibile ingresso un algoritmo deve
trovare la corrispondente soluzione di costo minimo
risolvere il problema
computare un'uscita corrispondente alla stringa di input ricevuta in ingresso
scegliere una di due risposte possibili: "si" o "no"
individuare la decisione che risolve il problema
40
262. La classe delle funzioni corrispondenti a problemi decisionali è quella delle funzioni
computabili del tipo f: N -> {0,1}
f: N -> {0,1}
computabili del tipo f: N -> R
computabili del tipo f: stringhe -> {"si","no"}
le funzioni non c'entrano niente
41
268. Un problema di ottimizzazione richiede
di individuare quale fra "si" o "no" sia la soluzione del problema
di trovare la soluzione ottima per il problema dato
di trovare il massimo o il minimo di una funzione
di utilizzare in modo ottimo le risorse disponibili
di ottimizzare i dati del problema
42
se esiste un algoritmo polinomiale che, dato in input un qualsiasi x={0,1}*, produce come output
f(x).
se il tempo di calcolo è del tipo nx
277. Un algoritmo non deterministico A calcola una funzione f : N -> {0,1} se:
per ogni a ∈ N tale che f(a)=1 tutte le realizzazioni di A terminano
per ogni a ∈ N tale che f(a)=1 tutte le realizzazioni di A terminano restituendo 1
per ogni a ∈ N tale che f(a)=1 esiste una realizzazione di A che ritorna 1
per ogni a ∈ N tale che f(a)=0 esiste una realizzazione di A che ritorna 0
per ogni a ∈ N tale che f(a)=0 tutte le realizzazioni di A terminano restituendo 0
43
279. Si sa che
NP ⊆ P
P ⊆ NP
P = NP
P ≠ NP
P ⊂ NP
282. Per dimostrare la NP completezza di una funzione f dalla definizione di NP completezza si richiede
di:
dimostrare che f è non deterministica polinomiale
dimostrare che f non è in P
dimostrare che f è riducibile polinomialmente qualunque altra funzione in NP
che la funzione è in NP
dimostrare che qualunque altra funzione in NP è riducibile polinomialmente alla funzione data
284. La prova di NP completezza del problema del sottografo completo (CSP) può essere fatta
riducendo SAT a CSP
riducendo CSP a SAT
riducendo CSP a TSP
aumentando SAT a CSP
aumentando CSP a SAT
44
285. Il problema vertex cover, dato un grafo G=(V,E), richiede di:
trovare il massimo numero di archi che abbiano un estremo in uno dei vertici in V
trovare il minimo numero di archi tale per cui ogni vertice in V abbia almeno un arco uscente
trovare un sottinsieme S di dimensione minima dei vertici in V, tale per cui ogni arco abbia un
vertice in S
trovare il massimo numero di vertici in V tale per cui gli archi restino coperti
coprire tutti i vertici di G con un cammino hamiltoniano
291. In un taglio (A,B) di una rete di flusso G = (V, E) con sorgente s e pozzo t in cui
s∈Aet∈A
s∈Aet∈B
s∈Bet∈B
s e t possono appartenere a qualunque delle due partizioni
45
292. In un taglio (A,B) di una rete di flusso G = (V, E) con sorgente s e pozzo t ha una capacità c(A,B)
è pari alla somma delle capacità degli archi con il primo estremo in B e il secondo in A
è pari alla somma delle capacità degli archi della partizione A
è pari alla somma delle capacità degli archi della partizione B
è pari alla somma delle capacità degli archi con il primo estremo in A e il secondo in B
è pari alla somma delle capacità di tutti gli archi del grafo
293. In un taglio (A,B) di una rete di flusso G = (V, E) con sorgente s e pozzo t il flusso attraverso il taglio
è pari alla somma dei flussi sugli archi con il primo estremo in B e il secondo in A
è pari alla somma dei flussi sugli archi della partizione A
è pari alla somma dei flussi sugli archi della partizione B
è pari alla somma dei flussi su tutti gli archi del grafo
è pari alla somma dei flussi sugli archi con il primo estremo in A e il secondo in B
294. Il teorema max flow – min cut per reti di flusso asserisce che
il flusso minimo in una rete G=(V,A) è pari alla capacità del taglio di G di capacità minima.
il flusso massimo in una rete G=(V,A) è pari alla capacità del taglio di G di capacità minima.
il flusso massimo in una rete G=(V,A) è pari alla capacità del taglio di G di capacità massima.
il flusso minimo in una rete G=(V,A) è pari alla capacità del taglio di G di capacità minima.
295. Data una rete G(V,A) su cui circola un flusso f, il grafo residuo _ ( , _ )
è un sottografo di G contenente solo gli archi di A con capacità residua positiva o nulla
è un supergrafo di G contenente gli archi di A e gli archi residui
è un sottografo di G contenente solo gli archi di A con capacità residua strettamente positiva
è un supergrafo di G contenente gli archi di A con capacità residua incrementale
296. Un cammino aumentante nella rete G in cui circola un flusso f (eventualmente nullo)
è un cammino da s a t aumentato di un arco
è un cammino fra due nodi qualunque del grafo residuo che permette di aumentare il flusso
è un cammino fra due nodi qualunque del grafo G che permette di aumentare il flusso
è un cammino da s a t nel suo grafo residuo
46
299. La capacità residua di un arco , con flusso , è
, = , − , direzione →
, = , − , direzione →
, = , direzione →
, = , direzione →
305. Nel problema min-cost max-flow gli archi residui (u,v) in una rete con flusso f
hanno capacità invariate e !"# = !"# , e !"# = – !"# .
hanno capacità invariate e !"# = !"# , e !"# = – !"# .
hanno capacità definite come nel flusso massimo e !"# = !"# , e !"# =–
!"# .
hanno capacità definite come in Kruskal e !"# =$ , e !"# =–$ .
47
306. Nell’algoritmo cycle cancelling per il problema min-cost max-flow
Il flusso s-t viene incrementalmente aumentato su cammini aumentanti di costo decrescente
Il flusso s-t viene incrementalmente aumentato individuando cicli di flussi da cancellare
Il flusso s-t viene incrementalmente aumentato analogamente ad Edmonds-Karp
Dopo la prima allocazione la quantità di flusso da s a t non cambia mai
48
49