Complexidade de Algoritmos (exemplos)

From Wiki**3

Procura Sequencial

Pior caso: analisa todos os N elementos: tempo é O(N)
Melhor caso: analisa apenas o 1º elemento: tempo é O(1)

 int search(int a[], int v, int l, int r) {
   int i;
   for (i = l; i <= r; i++)
     if (v == a[i]) return i;
   return -1;
 }

Procura Binária

Pior caso: Pior caso: analisa um número de elementos igual a [log N]+1: tempo é O(log N)

 int search(int a[], int v, int l, int r) { 
   while (r >= l) {
     int m = (l+r)/2;
     if (v == a[m]) return m;
     if (v < a[m]) r = m-1; else l = m+1;
   }
   return -1;
 }

Preenchimento de Matriz

Pior caso: são preenchidas N² entradas da matriz: tempo é O(N²)

 int mat_read(int mat[N][N]) {
   int i, j;
   for (i = 0; i < N; i++)
     for (j = 0; j < N; j++)
       scanf("%d", &mat[i][j]);
   return -1;
 }

Multiplicação de matrizes

Pior caso: três ciclos de N iterações encadeados: tempo é O(N³)

 int mat_mult(int matA[N][N], int matB[N][N], int matC[N][N]) {
   int i, j, k;
   for (i=0; i<N; i++)
     for (j=0; j<N; j++) {
       matC[i][j] = 0;
       for (k=0; k<N; k++)
         matC[i][j] += matA[i][k] * matB[k][j];
     }
 }

Pesquisa Binária (outro exemplo)

Este exemplo mostra como uma implementação cuidada pode melhorar o desempenho de um algoritmo.

O algoritmo procura um par de parcelas que produzam a soma fornecida. Os dados de entrada para o algoritmo, assim como a função main, são como se segue.

 static int vect[] = { -1, 1, 2, 4, 6, 8, 10, 15, 20, 25 };
 static int size   = 10;
 int main(int argc, char **argv) {
   int p1, p2, y = lookup(vect, size, atoi(argv[1]), &p1, &p2);
   if (y > 0) printf("%d %d\n", p1, p2);
 }

Primeira versão: utilização de uma função pré-definida

Tempo de execução: T(N) = O(N log N).

 int lookup(int v[], int sz, int x, int *p1, int *p2) {
   int i;
   for (i=0; i < sz; i++) {
     int d = x - v[i], y;
     y = search(v, d, 0, sz-1);  /* procura binária */
     if (y > 0) { *p1 = i; *p2 = y; return 1; }
   }
   return -1;
 }

Segunda versão: implementação dedicada

Tempo de execução: T(N) = O(N).

 int lookup(int v[], int sz, int x, int *p1, int *p2) {
   int i = 0, j = sz-1;
   while (i < j) {
     int sum = v[i] + v[j];
     if      (sum > x) j--;
     else if (sum < x) i++;
     else { *p1 = i; *p2 = j; return 1; }
   }
   return -1;
 }