Nesta lista a complexidade pedida corresponde ao O(n) - Big O - limite superior.
int a = 0, b = 0; for (i = 0; i < N; i++) { a = a + rand(); } for (j = 0; j < M; j++) { b = b + rand(); }
int a = 0; for (i = 0; i < N; i++) { for (j = N; j > i; j--) { a = a + i + j; } }
int i, j, k = 0; for (i = n / 2; i <= n; i++) { for (j = 2; j <= n; j = j * 2) { k = k + n / 2; } }
int a = 0, i = N; while (i > 0) { a += i; i /= 2; }
float soma (float valores[], int n) { int i; float _soma = 0; for (i=0; i < n; i++) _soma += valores[i]; return _soma; }
int buscaSequencial(char vetor[], int n, char dado) { int i; for (i=0; i<n; i++){ if ( vetor[i] == dado ) return(i); } return -1; }
int buscaBinaria( char vetor[], char dado, int inicio, int fim) { int meio = (inicio + fim)/2; if ( vetor[meio] == dado ) return (meio); if ( inicio >= fim ) return ‐1; if ( dado < vetor[meio] ) return buscaBinaria (vetor, dado, inicio, meio‐1); else return buscaBinaria (vetor, dado, meio+1, fim); }
void multMatriz(float **a, float **b, int n, int p, int m, float **x) { int i,j,k; for (i=0;i<n;i++) { for (j=0;j<m;j++) { x[i][j]=0.0; for (k=0;k<p;k++) x[i][j]+=a[i][k]*b[k][j]; } } }
void bolha (int n, int* v) { int fim,i; for (fim=n-1; fim>0; fim--) for (i=0; i<fim; i++) if (v[i]>v[i+1]) { int temp = v[i] /* troca */ v[i] = v[i+1]; v[i+1] = temp; } }
void rapida (int n, int* v){ if (n > 1) { int x = v[0]; int a = 1; int b = n-1; do { while (a < n && v[a] <= x) a++; /* teste a<n */ while (v[b] > x) b--; /* nao testa */ if (a < b) { /* faz troca */ int temp = v[a]; v[a] = v[b]; v[b] = temp; a++; b--; } } while (a <= b); /* troca pivô */ v[0] = v[b]; v[b] = x; /* ordena sub-vetores restantes */ rapida(b,v); rapida(n-a,&v[a]); } }Qual o pior caso no algoritmos de quicksort? Mostre que ele em geral tem uma complexidade, mas no pior caso tem outra. Como podemos evita-la?
#include <stdio.h> void torres(int n, char origem, char destino, char auxiliar) { if (n==1) { printf("Mova o disco 1 do Poste %c para o Poste %c\n", origem,destino); return; } else { torres(n-1, origem, auxiliar, destino); printf("Mova o disco %d do Poste %c para o Poste %c\n",n,origem,destino); torres(n-1, auxiliar, destino, origem); } } #define N 3 int main( void ) { torres(N,'A','C','B'); return 0; }
f(0) = 0 f(1) = 1 f(n) = f(n-1) + f(n-2) para n>1Os dois algoritmos abaixo calculam o n-esimo termo da série.
/* iterativo */ int fibonacci_iterativo(int n) { if (n==0) return 0; else if (n==1) return 1; else { int j,anterior=0,atual=1; for (j=2;j<n;j++) { int proximo=atual+anterior; anterior=atual; atual=proximo; } return atual; } } /* recursivo */ int fibonacci_rec(int n) { if (n==0) return 0; else if (n==1) return 1; else return fibonacci_rec(n-1)+fibonacci_rec(n-2); }Qual a complexidade do algoritmo iterativo? Quantas chamadas recursivas ocorrem no algoritmo recursivo faz para n=5? Na sua avaliação qual dos dois algoritmos é mais eficiente? Por que?