20
11ª Semana de Sistemas de Informação 4/10/2011 [email protected]

Computadores modernos compensam algoritmos ineficientes?

Embed Size (px)

DESCRIPTION

Palestra ministrada na "11ª Semana de Sistemas de Informação" na Faculdade 7 de Setembro. Questionei, por meio de 5 algoritmos que encontram números primos em um certo intervalo, o mito "computadores modernos compensam algoritmos ineficientes", propagado por muitos programadores iniciantes.

Citation preview

Page 1: Computadores modernos compensam algoritmos ineficientes?

11ª Semana de Sistemas de Informação4/10/2011

[email protected]

Page 2: Computadores modernos compensam algoritmos ineficientes?

“Pra quê perder tempo estudando um algoritmo adequado? Se compilar está de bom tamanho.”

“Não há necessidade de se fazer um código eficiente. Os processadores são poderosos hoje em dia mesmo!”

“Pra quê se preocupar com uso de memória se hoje em dia é algo que temos de sobra?”

Page 3: Computadores modernos compensam algoritmos ineficientes?

Cinco algoritmos semelhantes

Encontrar números primos

Comparar o desempenho

Page 4: Computadores modernos compensam algoritmos ineficientes?

Um número N pertencente aos naturais é primo se possuir somente dois divisores: 1 e N.

Page 5: Computadores modernos compensam algoritmos ineficientes?
Page 6: Computadores modernos compensam algoritmos ineficientes?

int main(){ int n, i, divisores = 0; for (n = 50000000; n <= 60000000; n++){ for (i = 2; i < n; i++){ if (n % i == 0){ divisores++; } } if (divisores == 0){ cout << n << "\t"; } divisores = 0; }}

Page 7: Computadores modernos compensam algoritmos ineficientes?
Page 8: Computadores modernos compensam algoritmos ineficientes?

int main(){ int n, i, divisores = 0; for (n = 50000001; n <= 60000000; n = n + 2){ for (i = 3; i < n; i = i + 2){ if (n % i == 0){ divisores++; } } if (divisores == 0){ cout << n << "\t"; } divisores = 0; }}

Page 9: Computadores modernos compensam algoritmos ineficientes?
Page 10: Computadores modernos compensam algoritmos ineficientes?

int main(){ int n, i, divisores = 0; for (n = 50000001; n <= 60000000; n = n + 2){ for (i = 3; i < n; i = i + 2){ if (n % i == 0){ divisores++; break; } } if (divisores == 0){ cout << n << "\t"; } divisores = 0; }}

Page 11: Computadores modernos compensam algoritmos ineficientes?
Page 12: Computadores modernos compensam algoritmos ineficientes?
Page 13: Computadores modernos compensam algoritmos ineficientes?

int main() { int n, i, divisores = 0; for (n = 50000001; n <= 60000001; n = n + 2) { for (i = 3; i <= n/2; i = i + 2) { if (n % i == 0) { divisores++; break; } } if (divisores == 0) { cout << n << "\t"; } divisores = 0; }}

Page 14: Computadores modernos compensam algoritmos ineficientes?
Page 15: Computadores modernos compensam algoritmos ineficientes?

“Todo número composto N possui algum divisor primo menor ou igual a raiz quadrada de N”.

Basta testar até a raiz quadrara de N para saber se N é um número é primo.

Page 16: Computadores modernos compensam algoritmos ineficientes?

int main() { int n, i, divisores = 0; for (n = 50000001; n <= 60000001; n = n + 2){ for (i = 3; i <= sqrt(n); i = i + 2) { if (n % i == 0) { divisores++; break; } } if (divisores == 0) { cout << n << "\t"; } divisores = 0; }}

Page 17: Computadores modernos compensam algoritmos ineficientes?
Page 18: Computadores modernos compensam algoritmos ineficientes?

Primos encontrados*

Quantidade de divisões realizadas

1º 2° 3° 4° 5°

1 19998 4999 2501 1250 35

2 50025 12505 5007 2504 72

3 60042 15009 7511 3755 106

4 110187 27544 10038 5027 158

5 120228 30054 12548 6281 192

*No intervalo (5000;6000]

O 5º algoritmo é cerca de 620 vezes mais eficiente do que o 1º

Page 19: Computadores modernos compensam algoritmos ineficientes?
Page 20: Computadores modernos compensam algoritmos ineficientes?

É uma falácia sem vergonha!

SEM VERGONHA!

Um Hardware poderoso NÃO COMPENSA um código ineficiente.