[Algoritmi] Domande Vero o Falso

xneo1
Ciao a tutti, siccome, a breve, dovrei sostenere l'esame di algoritmi e in giro non si trova neanche un frammento di appello svolto, avrei pensato di postare una parte di un esercizio dell'esame composto da domande V o F.

Allora io avrei pensato di scrivere le domande, fornire e spiegare la risposta e magari discuterne in caso una risposta, secondo voi sia sbagliata.
Le risposte le copro in modo che se c'è qualcuno che vuole provare a farle per conto suo e libero di non essere influenzato.

1) La complessità (temporale) intrinseca del problema di calcolare la somma di un array di interi è \(\displaystyle \Omega(n) \), dove \(\displaystyle n \) è il numero di interi presenti nel array.



2) La complessità temporale del problema dell’inserimento in una array ordinato di interi è \(\displaystyle \Omega(log(n)) \).



3) La funzione \(\displaystyle f(n) \) = \(\displaystyle 2n log(n^2) \) è \(\displaystyle O(n log(n)) \).



4) Sia G un grafo non orientato che contiene almeno un ciclo. Il numero di componenti connesse massimali è minore o uguale a n-2, dove n è il numero di nodi di G



5) Sia G un grafo pesato connesso, orientato, ed aciclico i cui pesi sono numeri positivi. l’algoritmo di Floyd potrebbe non essere in grado di calcolare le distanze minime fra tutte le coppie di nodi di G.



6)La complessità dell’inserimento di un elemento in una tabella hash in cui sono presenti n elementi nel caso peggiore è \(\displaystyle \Theta(n) \).



7) La complessità spaziale della visita infissa di un albero è \(\displaystyle \Omega(n^2) \), dove \(\displaystyle n \) è il numero di nodi presenti nell’albero.



8) La complessità temporale dell’algoritmo di Dijkstra è \(\displaystyle \Theta(n^2) \), dove \(\displaystyle n \) è il numero di nodi presenti nel grafo, nel caso di rappresentazione con liste di adiacenza.



9) Per ogni coppia di nodi u,v appartenenti ad un grafo orientato debolmente connesso esiste sempre un cammino dal nodo u al nodo v e dal nodo v al nodo u.



10) Un grafo non orientato connesso e pesato (sugli archi) ammette sempre un unico albero ricoprenti di costo minimo.


Risposte
onlyReferee
Ciao xneo :!:
Direi che hai fatto un buon lavoro e mi sembra un modo utile per prepararsi all'esame. In alcuni casi (in domande di questo genere) si può fornire un controesempio per avere una risposta immediata in altri invece serve un minimo di dimostrazione.

xneo1
grazie, avrei scommesso che la prima risposta fosse stata la tua :)
Sempre utile.

onlyReferee
E ti pareva che ti aspettassi la mia risposta :D. A noi comunque non hanno mai fatto nemmeno un esame con le domande vero/falso o a risposta multipla quindi, seppur si debba studiare tanto in ogni caso, secondo me potete ritenervi fortunati in un certo senso.

xneo1
Comunque l'esame non è composto solo da domande vero o falso, c'è anche un esercizio di programmazione con relativo calcolo della complessità temporale e spaziale nel caso peggiore e migliore e una domanda di teoria.
Inoltre molte domande vero o falso sono a trabocchetto e se sbagli vengono tolti dei punti.

Ora, siccome sei stato più utile del mio prof, posso ritenermi fortunato se riesce a filare tutto liscio all'esame.

tipatoga
ciao, sto studiando il tuo stesso esame...tu lo hai fatto a settembre??

Rossella921
Ciao, sto preparando lo stesso esame e ho una domanda:
Esiste un algoritmo avente complessità spaziale teta(n) e complessità temporale teta(log(n))? n è la dimensione del input.
Io risponderei farlo perché mi viene in mente l algoritmo di ricerca binaria che ha una complessità temporale log(n) ma ma spaziale non è teta(n).
Grazie

vict85
La prima risposta, nel caso parallelo non è precisa, seppur il professore probabilmente non volesse chiedere questo aspetto. La tua risposta è corretta se si suppone che il numero di processi paralleli sia fissato (e uguale a due). Supponi invece di averne infiniti e che ogni processore valuti una somma per unità temporale. Allora ad ogni passo ti trovi a dover calcolare la somma di un array che possiede la metà degli elementi. In totale quindi, in presenza di infiniti processori, puoi fare la somma in tempo logaritmico.

Rossella921
Quindi se suppongo che i processi paralleli siano fissati non esiste un algoritmo con complessità spaziale e temporale definita in quel modo?

apatriarca
Non ho capito la tua domanda, ma provo a darti una spiegazione di quello che puoi fare con processi paralleli. Consideriamo i valori con indici pari e quelli con indici dispari del nostro array. Se li sommiamo a coppie avremo un array di somme di lunghezza \(N/2\). Ripetendo il procedimento avremo un algoritmo che calcola la somma dell'array in \(\log_2 n\) passi \(p\) di costo \( N\,2^{-p}. \) Con un singolo processore la complessità è \(O(N).\) Se abbiamo \(K\) processori possiamo suddividere il costo di ogni step di \(K\) e quindi ottenere un costo \(K\) volte inferiore a quello originario (ma la complessità è comunque ancora lineare). Per ottenere una complessità diverse è necessario ricorrere ad un numero illimitato di processi paralleli in modo da ridurre il costo di ogni passo ad una costante e quindi avere una complessità logaritmica.

vict85
Mi riferivo alla discussione iniziale. Riguardo alla tua domanda dipende se consideri la dimensione del l'input incluso o meno nella complessità spaziale. Se lo è, allora qualsiasi algoritmo logaritmico su un array ne è un esempio. Altrimenti non è possibile: un qualsiasi algoritmo può produrre dati addizionali per step non maggiori di un multiplo costante del numero dei processi.

apatriarca
L'unico punto su cui non sono d'accordo è il seguente:

6. L'inserimento in una tabella di hash può avere costo lineare se tutti gli elementi inseriti sono stati mappati allo stesso valore di hash. Si tratta di un rischio (e attacco) reale in sistemi che fanno ricorso a tabelle di hash.

Rossella921
Vorrei fare una domanda: come faccio a calcolare il numero di occorrenze in un albero binario? In modo ricorsivo.
Verifico il caso base quindi se l'albero è vuoto restituisco zero, e anche se lo sono i sotto alberi sinistro r destro.
Poi dovrei effettuare il controllo, ma non riesco proprio in questo passaggio!

apatriarca
Con numero di occorrenze intendi il numero di volte che un particolare valore è presente nell'albero? Se è questo alla la risposta è uguale al numero di occorrenze nei figli più 1 se il nodo ha quel valore o zero altrimenti. Chiedevi questo?

Rossella921
e come faccio a calcolare le occorrenze nei figli?

apatriarca
Chiamando la funzione ricorsivamente sui due figli.

Rossella921
Allora se ho questo algoritmo
int contaRipetuti( AlberoB a){
If (a==null) return 0;
If(a.sin()==null && a.des()==null) return 0;
E poi? Se richiamo un altro metodo come verifico se due valori sono uguali? Cioè dovrei scrivere a.sin()==a.des() ?

apatriarca
Ma come sono definiti i nodi del tuo albero? Cosa intendi dire con conteggio delle occorrenze esattamente? Quali dovrebbero essere gli input e gli output?

Rossella921
Mi chiede di implementare il metodo "int contaOccorrenze(Albero Binario a)" che restituisce il numero di valori che appaiono almeno due volte in a.

apatriarca
Ok, pensavo che il problema fosse un altro. L'albero binario è generico o contiene i valori ordinati (tipo in un albero di ricerca)? Si può fare ricorso a vettori o altre strutture dati aggiuntive?

Rossella921
È un albero binario generico, perché non mi dà nessun altra informazione!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.