Esercizi sulla complessità computazionale
Si scriva la complessità computazionale approssimativa (considerando nel comportamento asintotico
l’ordine dell’infinito) in funzione della dimensione n del problema, per ciascuno dei seguenti algoritmi.
1) i = 0;
while (i < n)
i = i + 1;
2)
3) i=0;
while (i*i < n)
i = i + 1;
4)
Il codice è scritto in Ansi C quindi printf sta per cout mentre scanf sta per cin.
5) La dimensione dell’input è n
int f5 (int A [], int n, int x)
{
int i=0;
int j=n - 1;
while (i <= j)
{
int k=(i+j)/2;
if (x == A[k]) return 1;
if (x < A[k]) j= k - 1;
else i= k+1;
}
return 0;
}
6) Dato il seguente problema: “Dato un array di n numeri reali (solo positivi o negativi, lo zero è
escluso), progettare un algoritmo efficiente che posizioni tutti gli elementi negativi prima di tutti gli
elementi positivi.
Calcolare la complessità dei seguenti algoritmi scritti in pseudo-codifica:
Funzione SeparaPositiviNegativi(A, B)
int pos = 1; neg = n;
FOR i = 1 TO n DO
IF A[i]>0 THEN
B[pos] = A[i];
pos++;
ELSE
B[neg] = A[i];
neg--;
Funzione SeparaPositiviNegativi2(A)
i = 1; j = n;
WHILE (i < j)
WHILE (A[i]>0 AND i < j) DO
i++;
WHILE (A[j]<0 AND i < j) DO
j--;
SCAMBIA(A[i], A[j]);
i++; j--;
7) for (int i=0; i<n; i++)
for(int j=0; j<n; j++)
for (int z=0; z<n; z++)
cout<<i+j+z;
8) for (int i=0; i<n; i++)
for(int j=i; j<n; j++)
cout<<”Ciao”;
9) Si discuta la funzione cc per il seguente problema: “trovare la somma di n valori di un array”.
10) Si discuta la funzione cc per il seguente problema: “dato un vettore di N elementi compresi tra 0 e
9, si trovi la cifra (tra 0 e 9) maggiormente presente nel vettore”.
11) Si discuta la funzione cc per il seguente problema: “dato un vettore di N elementi interi, verificare
se esiste una combinazione di elementi del vettore (es. 2 elementi, 3 elementi, …) tale che la
somma di tali elementi dia K”.