1. Associa ogni problema sui vettori alla sua complessità in tempo attesa
| Ricerca sequenziale: O(n), ... |
| Ricerca binaria: O(log2n), ... |
| Copiare: O(n), sono coinvolti n elementi |
| Aggiungere un elemento alla fine: O(1), numero di operazioni costante |
| Aggiungere un elemento all’inizio:
| O(1), numero di operazioni costante se il primo elemento viene copiato alla fine e il nuovo inserito in prima posizione |
| O(n), se gli elementi presenti vengono "traslati" in avanti di una posizione per "fare spazio" |
|
| Copiare una matrice quadrata nxn: O(n2), sono coinvolti n2 elementi |
2. Risolvi il problema: "Quante coppie ordinate sono presenti in un vettore?".Per coppia ordinata intendo due elementi adiacenti con il primo valore minore o uguale del secondo. Se il vettore è V = (1, 3, 2, 1, 3, 7) sono presenti 3 coppie ordinate di elementi adiacenti: 1°: (1, 3), 4°: (1, 3) e 5°: (3, 7). function COPPIEORD(V: Vettore; N: Integer): Integer;funzione intera con parametri IN il vettore e il numero di elementi. È necessario scandire il vettore e per ognuna delle N-1 coppie testare se è ordinata o meno; se è ordinata si incrementa un contatore che sarà il valore di ritorno della funzione. Function COPPIEORD(V: Vettore; N: Integer): Integer;Var i, CONTA: Integer;Begin CONTA:=0; for i:=1 to N-1 do if(V[i] <= V[i+1])then Inc(CONTA); CONTAORD:=CONTA;End;N-1 test, con N-1 incrementi al max, quindi O(n) 3. Dovendo risolvere il problema: "Quante volte compare un elemento all’interno di un vettore ordinato?", discuti i possibili algoritmi risolutivi in funzione della loro complessità in tempo.
| Con una scansione sequenziale "for ..." il tempo di attesa è n |
| Con una scansione parziale "while... con condizione (V[i] <= X)" il tempo di attesa diventa n/2 nel caso medio... |
| Con una ricerca binaria si potrebbe individuare l'elemento, O(log2n), e poi con due scansioni "parziali" conteggiare gli elementi uguali adiacenti. Se il vettore è "grande" e l'elemento è ripetuto "poche" volte si ha un vantaggio significativo. |
|