MC-102 - Slide 13
Noções de eficiência e buscas
Elaborado por Raoni Teixeira e Editado por Danillo Roberto Pereira
Instituto de Computação – Unicamp
Introdução
Por que usar computadores?
Fazer “contas”automaticamente. Fazer “contas”rapidamente.
Quão rápido é um computador?
Depende...
...do problema tratado. ...do algoritmo utilizado.
Introdução
Por que usar computadores?
Fazer “contas”automaticamente.
Fazer “contas”rapidamente.
Quão rápido é um computador?
Depende...
...do problema tratado. ...do algoritmo utilizado.
Introdução
Por que usar computadores?
Fazer “contas”automaticamente.
Fazer “contas”rapidamente.
Quão rápido é um computador?
Depende...
...do problema tratado. ...do algoritmo utilizado.
Introdução
Por que usar computadores?
Fazer “contas”automaticamente.
Fazer “contas”rapidamente.
Quão rápido é um computador?
Depende......do problema tratado. ...do algoritmo utilizado.
Introdução
Por que usar computadores?
Fazer “contas”automaticamente.
Fazer “contas”rapidamente.
Quão rápido é um computador?
Depende...
...do problema tratado. ...do algoritmo utilizado.
Introdução
Por que usar computadores?
Fazer “contas”automaticamente.
Fazer “contas”rapidamente.
Quão rápido é um computador?
Depende...
...do problema tratado.
Introdução
Por que usar computadores?
Fazer “contas”automaticamente.
Fazer “contas”rapidamente.
Quão rápido é um computador?
Depende...
...do problema tratado. ...do algoritmo utilizado.
Tartaruga
Problema
A cada segundo, uma tartaruga dá um passo. O primeiro passo tem tamanho 1m, o segundo 1/2m, o terceiro 1/3m e assim por diante. Em quanto tempo ela anda 10m, 20m e 100m?
Tartaruga - 10 m
double dist; double n; dist = 0; n = 1; while (dist < 10.0) { dist = dist + 1.0/n; n = n + 1.0; }printf("Ela gastou %lf horas para andar %lf.\n", n / 3600, dist);
Tartaruga - 10 m
double dist; double n; dist = 0; n = 1; while (dist < 10.0) { dist = dist + 1.0/n; n = n + 1.0; }printf("Ela gastou %lf horas para andar %lf.\n", n / 3600, dist);
Tartaruga - 20 m
double dist; double n; dist = 0; n = 1; while (dist < 20.0) { dist = dist + 1.0/n; n = n + 1.0; }printf("Ela gastou %lf dias para andar %lf.\n", n / 3600 / 24 , dist);
Tartaruga - 20 m
double dist; double n; dist = 0; n = 1; while (dist < 20.0) { dist = dist + 1.0/n; n = n + 1.0; }printf("Ela gastou %lf dias para andar %lf.\n", n / 3600 / 24 , dist);
Tartaruga - 20 m
double dist; double n; dist = 0; n = 1; while (dist < 20.0) { dist = dist + 1.0/n; n = n + 1.0; }printf("Ela gastou %lf dias para andar %lf.\n", n / 3600 / 24 , dist);
Tartaruga - 100 m
double dist; double n; dist = 0; n = 1; while (dist < 100.0) { dist = dist + 1.0/n; n = n + 1.0; }printf("Ela gastou %lf anos para andar %lf.\n", n / 3600 / 24 / 365, dist);
Milhares e milhares de anos!!! E quanto tempo o
computador gasta para calcular isso?
Tartaruga - 100 m
double dist; double n; dist = 0; n = 1; while (dist < 100.0) { dist = dist + 1.0/n; n = n + 1.0; }printf("Ela gastou %lf anos para andar %lf.\n", n / 3600 / 24 / 365, dist);
Milhares e milhares de anos!!!
E quanto tempo o
computador gasta para calcular isso?
Tartaruga - 100 m
double dist; double n; dist = 0; n = 1; while (dist < 100.0) { dist = dist + 1.0/n; n = n + 1.0; }printf("Ela gastou %lf anos para andar %lf.\n", n / 3600 / 24 / 365, dist);
Milhares e milhares de anos!!! E quanto tempo o
computador gasta para calcular isso?
Adivinhação
Problema
Você e uma amiga fizeram uma aposta: ela pensa em um número entre 1 e 1.000.000 e você tem que adivinhar esse número. Se errar um palpite, você paga dez centavos, mas se acertar o número, recebe dez reais. A cada resposta errada, sua amiga deve dizer se o número que ela pensou é maior ou menor que o palpite. Escreva um algoritmo para adivinhar o número.
Adivinhação
int palpite, numero; char caractere;
for (palpite = 1; palpite <= 1000000; palpite++) { printf("O numero eh %d? ", palpite);
scanf("%c", &caractere); if (caractere == ’=’) { numero = palpite; break; } }
printf("O número eh %d!", numero);
Adivinhação
int palpite, numero; char caractere;
for (palpite = 1; palpite <= 1000000; palpite++) { printf("O numero eh %d? ", palpite);
scanf("%c", &caractere); if (caractere == ’=’) { numero = palpite; break; } }
printf("O número eh %d!", numero);
Adivinhação - Melhorando
int palpite, numero; char caractere;
int maior = 0, passo = 100000; // 100 mil
do {
maior = maior + passo;
printf("O numero eh %d? ", maior); scanf("%c", &caractere);
} while (caractere == ’>’);
for (palpite = maior-passo+1; palpite <= maior; palpite++) { printf("O numero eh %d? ", palpite);
scanf("%c", &caractere); if (caractere == ’=’) { numero = palpite; break; } }
Adivinhação - Algoritmo melhor (Busca Binária)
int palpite, menor, maior, encontrou, numero; char caractere;
menor = 1; maior = 1000000; encontrou = 0; while (!encontrou) {
palpite = (menor + maior) / 2; printf("O numero eh %d? ", palpite); scanf("%c", &caractere); if (caractere == ’=’) { numero = palpite; encontrou = 1; } else if (caractere == ’<’) { maior = palpite - 1; } else { menor = palpite + 1; } }
Restos legais
Problema
Escreva um programa que imprima o cubo de cada número entre 1 e 100 cujo o quadrado deixa resto 1 ou 5 quando divididos por 7. Conte o número de multiplicações que seu programa faz. Tente fazer o programa que gaste o menor número de multiplicações possíveis.
Restos legais
int i; for (i = 1; i <= 100; i++) { if (i*i % 7 == 1 || i*i % 7 == 5) { printf("%d\n", i*i*i); } }Restos legais
int i, resto; for (i = 1; i <= 100; i++) { resto = i*i % 7; if (resto == 1 || resto == 5) { printf("%d\n", i*i*i); } }Restos legais
int i, resto, quadrado;
for (i = 1; i <= 100; i++) { quadrado = i*i; resto = quadrado % 7; if (resto == 1 || resto == 5) { printf("%d\n", quadrado*i); } }
Exercício 1: otimizando
1 Escreva um programa que imprima os n primeiras somas parciais da
série n X i =1 (−2)n+i+ 1 2i .
Conte o número de multiplicações e somas que seu programa faz.
2 (Pequeno desafio) Tente escrever um programa que gaste menos
multiplicações para o problema dos restos legais do que os algoritmos da aula. Dica: os números 1, 8, 15... satisfazem à condição. O que eles têm em comum?
Exercício 2: busca sequencial
Problema
Escreva um programa que leia um número inteiro n e depois leia uma sequência de n números fracionários. Após isso, o usuário irá digitar um número fracionário m. O seu programa deverá imprimir:
Se o número m está na sequência, a ordem em que m foi inserido na sequência.
Quantos números da sequência são maiores ou iguais a m e a média desses números.
Exercício 3: busca binária
Problema
Escreva um programa que leia um número inteiro n e depois leia uma sequência de n números fracionários. Após isso, o usuário irá digitar um número fracionário m. O seu programa deverá imprimir:
Todos os números da sequência em ordem decrescente.
Se o número m está na sequência, a ordem em que m foi inserido na sequência. Escreva um programa mais eficiente que conseguir (Dica: use uma busca binária como no problema de advinhação da aula 11) Quantos números da sequência são maiores ou iguais a m e a média desses números.