Mdulo 9 4 Algoritmos 4 1 Definio e

  • Slides: 45
Download presentation
Módulo 9 4 Algoritmos 4. 1 Definição e Características 4. 2 Fatoração 4. 3

Módulo 9 4 Algoritmos 4. 1 Definição e Características 4. 2 Fatoração 4. 3 Pesquisa 4. 3. 1 Pesquisa Sequencial 4. 3. 2 Pesquisa Binária DCC 001 Programação de Computadores 2° Semestre de 2011 Prof. Osvaldo Carvalho DCC 001 - 2011 -2 1

Algoritmos e Programas DCC 001 - 2011 -2 2

Algoritmos e Programas DCC 001 - 2011 -2 2

Algoritmos e Programas n Algoritmo n Prescrição de passos para transformar uma informação de

Algoritmos e Programas n Algoritmo n Prescrição de passos para transformar uma informação de entrada em outra informação de saída n Cada passo prescrito deve ser uma operação garantidamente realizável n seja por operações elementares n seja por outro algoritmo n Programa n Um programa é a concretização de um algoritmo em uma linguagem executável DCC 001 - 2011 -2 3

Questões sobre Algoritmos e Problemas n Especificação: n Para qual problema precisamos de um

Questões sobre Algoritmos e Problemas n Especificação: n Para qual problema precisamos de um algoritmo? n Correção: n O algoritmo resolve mesmo o problema proposto? n Eficiência: n Qual é o consumo de recursos computacionais (tempo e memória, essencialmente) para se resolver o problema? DCC 001 - 2011 -2 4

Especificação n Surge de um processo de análise de um problema de transformação de

Especificação n Surge de um processo de análise de um problema de transformação de informação n Não é estática; muitas vezes uma especificação é modificada durante o processo de desenvolvimento, ou mesmo durante o uso de um programa n Ex. O caso de equações de 2º grau com o primeiro coeficiente igual a zero não foi previsto em nossos exemplos n Em problemas reais muitas vezes a especificação é a etapa mais demorada DCC 001 - 2011 -2 5

Correção n Podemos verificar se um algoritmo atende a uma especificação por um exame

Correção n Podemos verificar se um algoritmo atende a uma especificação por um exame de sua estrutura – uma prova formal de sua correção n Na prática somente algoritmos pequenos têm uma prova de correção viável n Testes são usados para ganhar convicção do bom funcionamento de um algoritmo n Testes podem descobrir erros, mas quase nunca garantir sua ausência DCC 001 - 2011 -2 6

Somador em Cascata Entrada b Entrada a SC DCC 001 - 2011 -2 SC

Somador em Cascata Entrada b Entrada a SC DCC 001 - 2011 -2 SC SC SC 7

Somador Testes ou Prova Formal? n Para testar completamente um somador de 32 bits

Somador Testes ou Prova Formal? n Para testar completamente um somador de 32 bits são necessários 264 testes! n Se estamos convencidos da correção de um circuito de soma completa, não temos problemas em aceitar a correção do somador n É da compreensão da estrutura do somador que vem a nossa convicção; testes viáveis cobrem uma fração ínfima do espaço de entradas DCC 001 - 2011 -2 8

Eficiência n Algoritmos com a mesma funcionalidade podem diferir muito em sua eficiência n

Eficiência n Algoritmos com a mesma funcionalidade podem diferir muito em sua eficiência n O termo complexidade é usado para designar uma função que descreve como o uso de recursos computacionais cresce com o tamanho da entrada de um algoritmo n Procura-se determinar a complexidade de um algoritmo de forma independente da velocidade de um computador específico e de outros fatores que afetam o tempo de execução de um programa DCC 001 - 2011 -2 9

Fatoração DCC 001 - 2011 -2 10

Fatoração DCC 001 - 2011 -2 10

Fatoração de Inteiros n Consiste em descobrir o menor divisor > 1 de um

Fatoração de Inteiros n Consiste em descobrir o menor divisor > 1 de um número inteiro n >= 2 dado n (se este fator for igual a n, n é primo) n Uma boa parte da segurança da informação em uso hoje em dia depende da dificuldade computacional de se fatorar um número n n Chaves criptográficas podem ser quebradas por fatoração Estas chaves são produtos de dois primos grandes, com 1024 ou 2048 bits cada DCC 001 - 2011 -2 11

A função Menor. Fator function p = Menor. Fator(n) p = 2; while modulo(n,

A função Menor. Fator function p = Menor. Fator(n) p = 2; while modulo(n, p) <> 0 p = p + 1; endfunction eh. Primo = Primo(n) eh. Primo = (n == Menor. Fator(n)); endfunction DCC 001 - 2011 -2 12

O programa Fatora. sce exec("Menor. Fator. sci"); n = input("n = "); while n

O programa Fatora. sce exec("Menor. Fator. sci"); n = input("n = "); while n >= 2 timer(); p = Menor. Fator(n) ; tempo. Gasto = timer(); // Imprime o resultado printf("n. Tempo = %8. 6 fs, %6 d é divisível por %6 d", . . . tempo. Gasto, n, p); if n == p then printf(" **PRIMO**") end n = input("n = "); end DCC 001 - 2011 -2 13

Dois Casos de Fatoração n Para 131101, primo, são feitas 131101 chamadas da função

Dois Casos de Fatoração n Para 131101, primo, são feitas 131101 chamadas da função modulo n Para 131103, somente 3 chamadas! n Conclusão: o tempo de execução pode depender da instância específica do problema n Para a fatoração, primos são o pior caso Tempo = 3. 062500 s, 131101 é divisível por 131101 **PRIMO** n = 131103 Tempo = 0. 000000 s, 131103 é divisível por DCC 001 - 2011 -2 3 14

Variações no Tempo de Execução n = 131101 Tempo = 2. 984375 s, 131101

Variações no Tempo de Execução n = 131101 Tempo = 2. 984375 s, 131101 é divisível por 131101 **PRIMO** n = 131101 Tempo = 3. 078125 s, 131101 é divisível por 131101 **PRIMO** n = 131101 Tempo = 3. 015625 s, 131101 é divisível por 131101 **PRIMO** n Um mesmo programa pode apresentar variações no tempo de execução de uma mesma instância de um problema n O principal motivo é o compartilhamento do computador DCC 001 - 2011 -2 15

Tempos do Programa Fatora. sce em dois computadores Somente números primos DCC 001 -

Tempos do Programa Fatora. sce em dois computadores Somente números primos DCC 001 - 2011 -2 16

Função de Complexidade n n é o tamanho de uma instância de um problema

Função de Complexidade n n é o tamanho de uma instância de um problema n Uma função caracteriza a complexidade de um algoritmo quando o seu tempo de execução é limitado por multiplicado por uma constante n A idéia é absorver na constante diferenças de desempenho entre computadores específicos n Escreve-se (“big O notation”) DCC 001 - 2011 -2 17

Complexidade da função Menor. Fator em função do número de bits na entrada DCC

Complexidade da função Menor. Fator em função do número de bits na entrada DCC 001 - 2011 -2 18

Melhorando a Fatoração n Se d é um divisor de n, existe d’ tal

Melhorando a Fatoração n Se d é um divisor de n, existe d’ tal que d*d’ = n n Temos ou d <= sqrt(n), ou d’ <= sqrt(n) n Portanto, ao fatorar só precisamos testar os divisores menores ou iguais à raiz de n n P. ex. , sqrt(12) = 3, 464, e só precisamos testar divisores menores ou iguais a 3 DCC 001 - 2011 -2 19

A Função Menor. Fator 2. sce function p = Menor. Fator 2(n) limite =

A Função Menor. Fator 2. sce function p = Menor. Fator 2(n) limite = int(sqrt(n)); p = 2; while modulo(n, p) <> 0 & p <= limite p = p + 1; end if modulo(n, p) <> 0 then p = n; endfunction DCC 001 - 2011 -2 20

Complexidade O(2^n) versus O(2^(n/2)) n Quando n = 10 bits a função modulo é

Complexidade O(2^n) versus O(2^(n/2)) n Quando n = 10 bits a função modulo é chamada n n ~1024 vezes com o primeiro algoritmo, e ~32 com o segundo. n Quando dobramos o tamanho do problema, com n = 20 bits, a função modulo é chamada n n ~1048576 vezes com o primeiro algoritmo, ou seja, 1024 vezes o tempo para n = 10 ~1024 vezes com o segundo algoritmo, ou seja, 32 vezes o tempo para n = 10! DCC 001 - 2011 -2 21

Pesquisa DCC 001 - 2011 -2 22

Pesquisa DCC 001 - 2011 -2 22

Pesquisa em Tabelas n Localizar um elemento em uma tabela é um problema clássico

Pesquisa em Tabelas n Localizar um elemento em uma tabela é um problema clássico da computação n Vamos ver dois algoritmos para isto: Pesquisa Sequencial n Pesquisa Binária n DCC 001 - 2011 -2 23

Pesquisa por um Número Primo n Vamos utilizar algoritmos de pesquisa para testar se

Pesquisa por um Número Primo n Vamos utilizar algoritmos de pesquisa para testar se um número é primo n Obviamente isto só funciona para números menores ou iguais ao maior número presente na tabela DCC 001 - 2011 -2 24

Tabela de Números Primos n Números primos têm propriedades matemáticas interessantes, e por isso

Tabela de Números Primos n Números primos têm propriedades matemáticas interessantes, e por isso são muito estudados n Na internet é possível encontrar arquivos com os primeiros muitos números primos n O arquivo 200000 primos. txt contém os 200. 000 primeiros números primos DCC 001 - 2011 -2 25

Início e Final do Arquivo 200000 primos. txt DCC 001 - 2011 -2 26

Início e Final do Arquivo 200000 primos. txt DCC 001 - 2011 -2 26

Especificação n Faça um programa que n Leia o arquivo 200000 primos. txt que

Especificação n Faça um programa que n Leia o arquivo 200000 primos. txt que contém os primeiros 200000 números primos n Leia repetidamente números inteiros e, para cada número lido, verifique se o número é primo utilizando a tabela lida. n O programa deve parar quando o número lido for 0 (zero). DCC 001 - 2011 -2 27

Pesquisa Sequencial DCC 001 - 2011 -2 28

Pesquisa Sequencial DCC 001 - 2011 -2 28

Pesquisa Sequencial function p = seq. Search(key, table) i = 1; // A chave

Pesquisa Sequencial function p = seq. Search(key, table) i = 1; // A chave nunca está à esquerda de i while i <= length(table) & table(i) ~= key i = i+1; end if i <= length(table) then p = i; else Convenção para valor p = -1; retornado quando a end pesquisa falha endfunction DCC 001 - 2011 -2 29

O Programa Verifica. Primos 3. sce arq. Tab = xgetfile("*. txt", pwd(), "Arquivo com

O Programa Verifica. Primos 3. sce arq. Tab = xgetfile("*. txt", pwd(), "Arquivo com Tabela"); tab. Primos = fscanf. Mat(arq. Tab); n = input("n = "); while n >= 2 timer(); eh_Primo = Primo 3(n, tab. Primos); tempo. Gasto = timer(); // Imprime o resultado printf("n. Tempo gasto = %g segundos", tempo. Gasto); if eh_Primo then printf("n. O número %d é primo!nn", n); else printf("n. O número %d não é primo!nn", n) end n = input("n = "); end DCC 001 - 2011 -2 30

A Função Primo 3. sce function e. Primo = Primo 3(n, tabela) e. Primo

A Função Primo 3. sce function e. Primo = Primo 3(n, tabela) e. Primo = seq. Search(n, tabela) ~= -1; endfunction DCC 001 - 2011 -2 31

Complexidade da Pesquisa Sequencial n Não é difícil ver que se n é o

Complexidade da Pesquisa Sequencial n Não é difícil ver que se n é o tamanho da tabela, o número de comparações feito em uma pesquisa por um elemento presente na tabela varia entre 1 e n n Se considerarmos todas as chaves presentes na tabela como tendo a mesma probabilidade de serem pesquisadas, o algoritmo fará em média n/2 comparações n O pior caso ocorre com pesquisas por chaves que não constam da tabela, quando são feitas n comparações n Nós dizemos que a complexidade da pesquisa sequencial é O(n), ou seja, cresce linearmente com o tamanho da tabela DCC 001 - 2011 -2 32

Pesquisa Binária DCC 001 - 2011 -2 33

Pesquisa Binária DCC 001 - 2011 -2 33

Pesquisa Binária n Quando a tabela tem suas entradas em ordem crescente (ou decrescente),

Pesquisa Binária n Quando a tabela tem suas entradas em ordem crescente (ou decrescente), podemos utilizar um algoritmo muito mais eficiente para a pesquisa n A chave é comparada com o elemento no meio da tabela. Se a chave for n n n Igual a este elemento: sucesso Menor: a pesquisa é reaplicada à metade inferior da tabela Maior: a pesquisa é reaplicada à metade superior da tabela DCC 001 - 2011 -2 34

Procurando por 71 DCC 001 - 2011 -2 35

Procurando por 71 DCC 001 - 2011 -2 35

Procurando por 37 DCC 001 - 2011 -2 36

Procurando por 37 DCC 001 - 2011 -2 36

Pesquisa Binária function p = Binary. Search(key, table, low, high) printf("nlength(table) = %d", high-low);

Pesquisa Binária function p = Binary. Search(key, table, low, high) printf("nlength(table) = %d", high-low); //extra if high < low then p = -1; else m = int((low+high)/2); if key == table(m) then p = m; else if key < table(m) then p = Binary. Search(key, table, low, m-1); else p = Binary. Search(key, table, m+1, high); end endfunction DCC 001 - 2011 -2 37

O Programa Verifica. Primos 5. sce // Programa para deteção de números primos exec("Primo

O Programa Verifica. Primos 5. sce // Programa para deteção de números primos exec("Primo 5. sci") exec("Binary. Search. sci") arq. Tab = uigetfile("*. txt", pwd(), "Arquivo com Tabela"); tab. Primos = fscanf. Mat(arq. Tab); n = input("n = "); while n >= 2 timer(); eh_Primo = Primo 5(n, tab. Primos); tempo. Gasto = timer(); // Imprime o resultado printf("n. Tempo gasto = %g segundos", tempo. Gasto); if eh_Primo then printf("n. O número %d é primo!nn", n); else printf("n. O número %d não é primo!nn", n) end n = input("n = "); end DCC 001 - 2011 -2 38

A Função Primo 5. sci function e. Primo = Primo 5(n, tabela) posicao =

A Função Primo 5. sci function e. Primo = Primo 5(n, tabela) posicao = Binary. Search( n, tabela, 1, length(tabela)); e. Primo = (posicao <> -1); endfunction DCC 001 - 2011 -2 39

Pesquisa Binária Passos para n = 16 n São 4 passos no pior caso

Pesquisa Binária Passos para n = 16 n São 4 passos no pior caso 24 23 22 21 20 DCC 001 - 2011 -2 40

Pesquisa Binária Qual é a maior tabela pesquisável com p passos? n Com p

Pesquisa Binária Qual é a maior tabela pesquisável com p passos? n Com p passos uma pesquisa é completada em uma tabela de tamanho <= 2 p 20 21 22 2 p DCC 001 - 2011 -2 … … 41

Complexidade da Pesquisa Binária n A cada passo o tamanho da porção da tabela

Complexidade da Pesquisa Binária n A cada passo o tamanho da porção da tabela é n n DCC 001 - 2011 -2 dividido por 2 No pior caso, o algoritmo termina quando o tamanho dessa porção é igual a 1 Com p passos, reduzimos a 1 o tamanho da porção examinada de uma tabela com n =~ 2 p elementos Temos no máximo log 2(n) passos Ou seja, a complexidade da pesquisa binária é logarítimica 42

Complexidade linear x complexidade logarítmica n Para pesquisar em uma tabela de 200. 000

Complexidade linear x complexidade logarítmica n Para pesquisar em uma tabela de 200. 000 elementos, a pesquisa binária faz no máximo log 2(200. 000) =~ 18 comparações n Para a mesma tabela, a pesquisa sequencial pode necessitar de 200. 000 comparações; n Se dobrarmos o tamanho da tabela, a pesquisa binária fará no máximo 19 comparações (uma a mais), enquanto que a pesquisa sequencial poderá fazer 400. 000 comparações! DCC 001 - 2011 -2 43

Resumo n Aspectos fundamentais do estudo de algoritmos são especificação, correção e complexidade n

Resumo n Aspectos fundamentais do estudo de algoritmos são especificação, correção e complexidade n Algoritmos podem ter desempenhos distintos para instâncias distintas de um mesmo problema n Procuramos caracterizar a complexidade de forma independente do desempenho de máquinas específicas DCC 001 - 2011 -2 44

Resumo n Muitas vezes podemos encontrar melhores algoritmos estudando propriedades do problema de transformação

Resumo n Muitas vezes podemos encontrar melhores algoritmos estudando propriedades do problema de transformação de informação n Algumas funções de complexidade indicam que poderíamos esperar milênios pela execução de um programa DCC 001 - 2011 -2 45