Análise de Algoritmos



Documentos relacionados
Invariantes de Laço. Profa. Sheila Morais de Almeida. junho DAINF-UTFPR-PG

PHP Estruturas de repetição

Capítulo 5: Repetições

Programação de Computadores I Estruturas de Repetição PROFESSORA CINTIA CAETANO

Estruturas de Repetição

MC Teste de Mesa e Comandos Repetitivos

Algoritmos e Estruturas de Dados I. Recursividade. Pedro O.S. Vaz de Melo

Exercícios de Fixação Aulas 05 e 06

Projecto Delfos: Escola de Matemática Para Jovens 1 TEORIA DOS NÚMEROS

Método Simplex Resolução Algébrica. Prof. Ricardo Santos

Isomorfismos de Grafos, Grafos Planares e Árvores

Congruências Lineares

2) Escreva um algoritmo que leia um conjunto de 10 notas, armazene-as em uma variável composta chamada NOTA e calcule e imprima a sua média.

Lista de Exercícios 5: Soluções Teoria dos Conjuntos

Lista de Exercícios 04 Estruturas de Dados Homogêneas - Vetores

Análise e Projeto de Algoritmos

Switch switch switch switch switch variável_inteira valor1 valor2 switch variável_inteira case case break switch case default default switch switch

Análise de algoritmos. Parte II

CAP. II RESOLUÇÃO NUMÉRICA DE EQUAÇÕES NÃO LINEARES

Roteiro da aula. MA091 Matemática básica. Conjuntos. Subconjunto. Aula 12 Conjuntos. Intervalos. Inequações. Francisco A. M. Gomes.

(a 2, b) = p 2 q 2. AV2 - MA Questão 1.

Bases Matemáticas. Daniel Miranda de maio de sala Bloco B página: daniel.miranda

Regressão, Interpolação e Extrapolação Numéricas

Algoritmo da Divisão AULA

Recursividade. Recursividade

Avaliação Baseada em Modelos Conceituais I - Engenharia Cognitiva

Equação e Inequação do 2 Grau Teoria

Controle de Fluxo Comandos de repetição: while e do-while

Modelos de Probabilidade e Inferência Estatística

Conjuntos Finitos e Infinitos

CIRCUNFERÊNCIA. Centro Diâmetro Secante Corda Tangente Ponto de tangência Normal Raio Distância do ponto P à circunferência. O AB s CD t T s AB 2

=...= 1,0 = 1,00 = 1,000...

PUC-Rio Desafio em Matemática 15 de novembro de 2008

OBSERVAÇÕES: EXERCÍCIOS

Programação Estruturada

CAMPUS DE GUARATINGUETÁ FACULDADE DE ENGENHARIA. Introdução à Programação em C. Algoritmos: Estruturas de Repetição. Prof. Dr. Galeno.J.

Relações. Antonio Alfredo Ferreira Loureiro. UFMG/ICEx/DCC MD Relações 1

Resolução de sistemas de equações lineares: Método de eliminação de Gauss

Algoritmos e Estruturas de Dados I. Variáveis Indexadas. Pedro O.S. Vaz de Melo

Programação Dinâmica. Aplicação directa - Fibonacci

CAPÍTULO O Método Simplex Pesquisa Operacional

EA976 Engenharia de Software. AULA 2 Ciclo de Vida de um Software

12 de Março de Aula 5

Definição de determinantes de primeira e segunda ordens. Seja A uma matriz quadrada. Representa-se o determinante de A por det(a) ou A.

Teoria Básica e o Método Simplex. Prof. Ricardo Santos

PROFMAT AV3 MA (1,0) (a) Prove isto: Se um número natural não é o quadrado de um outro número natural, sua raiz quadrada é irracional.

Recursividade. Prof. Jesus José de Oliveira Neto

Matrizes e Sistemas Lineares. Professor: Juliano de Bem Francisco. Departamento de Matemática Universidade Federal de Santa Catarina.

INF1005: Programação I. Algoritmos e Pseudocódigo

BCC202 - Estrutura de Dados I

MAE116 - Noções de Estatística

Seqüências. George Darmiton da Cunha Cavalcanti CIn - UFPE

Polos Olímpicos de Treinamento. Aula 1. Curso de Teoria dos Números - Nível 3. Divisibilidade 1. Carlos Gustavo Moreira e Samuel Barbosa Feitosa

COMPUTAÇÃO. O estudante deve ser capaz de apontar algumas vantagens dentre as seguintes, quanto à modalidade EaD:

Método Simplex Revisado

Teoria dos Números. A soma de dois números pares é sempre um número par. O produto de dois números pares é sempre um número par.

O cilindro deitado. Eduardo Colli

Ciclo com Contador : instrução for. for de variável := expressão to. expressão do instrução

Método Simplex das Duas Fases

Um número é divisível por 2 quando termina em 0, 2, 4, 6 ou 8, isto é, se for um número par.

Minicurso de Análise de Algoritmos

Exercícios: Recursão

C A P I T U L O 6 E S T R U T U R A S D E C O N T R O L E D E R E P E T I Ç Ã O

Exercícios: comandos de repetição

Solução de Sistemas Lineares

Quinto roteiro de exercícios no Scilab Cálculo Numérico

FABIANO KLEIN CRITÉRIOS NÃO CLÁSSICOS DE DIVISIBILIDADE

Experiência 1 Medidas: Leitura de instrumentos:

Resolução Numérica de Equações Parte I

Álgebra Linear AL. Luiza Amalia Pinto Cantão. Depto. de Engenharia Ambiental Universidade Estadual Paulista UNESP

Aula Extra. Depurador Code::Blocks. Monitoria de Introdução à Programação

Arquitetura de Computadores I

Algoritmos & Programação

Cálculo Numérico / Métodos Numéricos. Solução de sistemas não lineares Método de Newton

Aula 6 Medidas de Tendência Central

Coeficiente de Assimetria e Curtose. Rinaldo Artes. Padronização., tem as seguintes propriedades: Momentos

1. Escreva um programa em Pascal que leia três valores inteiros e mostre-os em ordem crescente. Utilize seleção encadeada.

Ficha de Exercícios nº 2

Fração é uma forma de representar uma divisão, onde o numerador é o dividendo e o denominador é o divisor. Exemplo:

Matemática Discreta Aritmética

Tutorial 3 Básico do VBA do Excel

CORPOS FINITOS E SEUS GRUPOS MULTIPLICATIVOS

Estruturas de Dados Aula 9: Listas (parte 1) 05/04/2011

Gabarito de Matemática do 6º ano do E.F.

BC-0504 Natureza da Informação

UNIPAC Araguari FACAE - Faculdade de Ciências Administrativas e Exatas SISTEMAS DE INFORMAÇÃO

Algoritmo Simplex em Tabelas. Prof. Ricardo Santos

Medidas de Tendência Central. Introdução Média Aritmética Moda Mediana

UNICAMP ª Fase MATEMÁTICA BERNOULLI COLÉGIO E PRÉ-VESTIBULAR

- Cálculo 1 - Limites -

Roteiro da aula. MA091 Matemática básica. Quadrados perfeitos. Raiz quadrada. Aula 8 Raízes. Francisco A. M. Gomes. Março de 2016

Medidas de dispersão e assimetria

Álgebra Linear AL. Luiza Amalia Pinto Cantão. Depto. de Engenharia Ambiental Universidade Estadual Paulista UNESP

números decimais Inicialmente, as frações são apresentadas como partes de um todo. Por exemplo, teremos 2 de um bolo se dividirmos esse bolo

Medida de Tendência Central

INF 1010 Estruturas de Dados Avançadas

Material Teórico - Módulo Números Naturais: Contagem, Divisibilidade e Teorema da Divisão Euclidiana. Números Naturais e Problemas de Contagem Parte 1

números decimais Inicialmente, as frações são apresentadas como partes de um todo. Por exemplo, teremos 2 de um bolo se dividirmos esse bolo

Transcrição:

Análise de Algoritmos Profa. Sheila Morais de Almeida DAINF-UTFPR-PG março - 2016

A invariante de laço pode ser definida como uma relação entre as variáveis de um algoritmo que é verdadeira em um determinado ponto p (ou linha p) do laço. Como é algo invariante, essa relação precisa ser verdadeira: antes de se executar os comandos da linha p pela primeira vez; durante a execução do laço, em todas as iterações, antes da execução da linha p; no fim da execução do laço, após a última execução da linha p.

Considere o seguinte algoritmo que computa a soma dos elementos de um vetor de inteiros: 1 int soma(int A) 2 s 0 3 i 1 4 while i A.lenght do 5 s s + A[i] 6 i i + 1 7 return s Invariante: No início de cada iteração do laço, a variável s contém a soma dos elementos do vetor A da posição 1 à posição i 1.

Considere o seguinte algoritmo que computa a soma dos elementos de um vetor de inteiros: 1 int soma(int A) 2 s 0 3 i 1 4 while i A.lenght do 5 s s + A[i] 6 i i + 1 7 return s Invariante: No início de cada iteração do laço, a variável s contém a soma dos elementos do vetor A da posição 1 à posição i 1.

Considere o seguinte algoritmo que computa a potência x n, para inteiros x e n: 1 int potencia(int x, int n) 2 p 1 3 i 0 4 while i < n do 5 p p x 6 i i + 1 7 return p Invariante: No início de cada iteração do laço, a variável p é igual a x i.

Considere o seguinte algoritmo que computa a potência x n, para inteiros x e n: 1 int potencia(int x, int n) 2 p 1 3 i 0 4 while i < n do 5 p p x 6 i i + 1 7 return p Invariante: No início de cada iteração do laço, a variável p é igual a x i.

Invariantes são utilizadas para provar a corretude de algoritmos iterativos. Os passos para tais provas são: 1 Identificar os laços e analisar um laço por vez, começando do mais interno. 2 Determinar uma invariante para cada laço: uma relação entre as variáveis que permanece verdadeira em todas as iterações e que é capaz de descrever qual o progresso feito pelo laço a cada iteração. (Achar a invariante é quase sempre a parte mais difícil.)

3 Provar as invariantes: provar que as invariantes dos laços são verdadeiras. 4 Usar as invariantes dos laços para provar que o algoritmo termina. 5 Provar corretude: usar as invariantes dos laços para provar que o algoritmo obtém o resultado correto.

1 int fibonacci(int n) 2 Se n = 0 então 3 retorna 0 4 a 0; b 1; i 2 5 while i n do 6 c a + b; 7 a b; 8 b c; i i + 1 9 return b Invariante: Para todo natural j 0, no início da iteração j + 1 (linha 5), i = j + 2, a = fibonacci(j) e b = fibonacci(j + 1).

1 int fibonacci(int n) 2 Se n = 0 então 3 retorna 0 4 a 0; b 1; i 2 5 while i n do 6 c a + b; 7 a b; 8 b c; i i + 1 9 return b Invariante: Para todo natural j 0, no início da iteração j + 1 (linha 5), i = j + 2, a = fibonacci(j) e b = fibonacci(j + 1).

Fatos sobre o algoritmo fibonacci(n): no início da primeira iteração do laço (linha 5), i = 2. Ok! no início da iteração j + 1 (linha 5), i = j + 1. Ok! no início da primeira iteração do laço (linha 5), a = 0.Ok! no início da iteração j + 1 (linha 5), a = b. Não! no início da primeira iteração do laço (linha 5), b = 1. Ok!

Fatos sobre o algoritmo fibonacci(n): no início da primeira iteração do laço (linha 5), i = 2. Ok! no início da iteração j + 1 (linha 5), i = j + 1. Ok! no início da primeira iteração do laço (linha 5), a = 0.Ok! no início da iteração j + 1 (linha 5), a = b. Não! no início da primeira iteração do laço (linha 5), b = 1. Ok!

Fatos sobre o algoritmo fibonacci(n): no início da iteração j + 1 (linha 5), b = c. não! No início de qualquer iteração (linha 5) c = a + b. Não! Em qualquer iteração, na linha 6, c = a + b. Ok!

Fatos sobre o algoritmo fibonacci(n): no início da iteração j + 1 (linha 5), b = c. não! No início de qualquer iteração (linha 5) c = a + b. Não! Em qualquer iteração, na linha 6, c = a + b. Ok!

Teorema da Invariante: Para todo natural j 0, no início da iteração j + 1 (linha 5), i = j + 2, a = fibonacci(j) e b = fibonacci(j + 1). Demonstração: A demonstração é por indução em j. Base: para j = 0 i = 0 + 2 = 2, a = 0 = fibonacci(0) e b = 1 = fibonacci(1). Hipótese: Para um inteiro 0 k < n, no incício da iteração k + 1 (linha 5), tem-se: i = k + 2, a = fibonacci(k) e b = fibonacci(k + 1).

Passo: Queremos mostrar que no início da iteração k + 2, linha 5: i = k + 3, a = fibonacci(k + 1) e b = fibonacci(k + 2). No início da k + 1-ésima iteração, i = k + 2 (por hipótese de indução). A variável i só é alterada na linha 8, quando é incrementada pelo comando i i + 1. Então no início da iteração k + 2, i = k + 2 + 1 = k + 3.

Passo: Queremos mostrar que no início da iteração k + 2, linha 5: i = k + 3, a = fibonacci(k + 1) e b = fibonacci(k + 2). Na k + 1-ésima iteração, linha 7, a b. Por hipótese de indução, no início da iteração, b = fibonacci(k + 1) e b não se alterou nas linhas 5 e 6. Então, na linha 7, tem-se a = b = fibonacci(k + 1). Como a não é alterada na linha 8, tem-se a = fibonacci(k + 1) no início da iteração k + 1.

Passo: Queremos mostrar que no início da iteração k + 2, linha 5: i = k + 3, a = fibonacci(k + 1) e b = fibonacci(k + 2). Na k + 1-ésima iteração, linha 6, c a + b. Como os valores de a e b não se alteram nas linhas 5 e 6, por hipótese de indução na linha 6, tem-se: c = a + b = fibonacci(k) + fibonacci(k + 1) = fibonacci(k + 2). Na linha 8, b c. Logo, na k-ésima iteração da linha 8, b = fibonacci(k + 2). O valor de b não se altera até o início da iteração k + 1, quando b = fibonacci(k + 2).

Prova de Corretude Teorema: O algoritmo retorna o valor de fibonacci(n). Demonstração: A afirmação é claramente verdadeira se n = 0 pelas linhas 2 e 3. Se n > 0, então entramos no laço. Na última iteração do laço, após a linha 8, i é igual a n + 1 e o laço termina. Pelo Teorema da Invariante, no início da iteração j + 1, i = j + 2. Então, j + 2 = n + 1. Então, j = n 1. Portanto, ocorreram n 1 iterações.

Prova de Corretude Teorema: O algoritmo retorna o valor de fibonacci(n). - Pelo Teorema da Invariante, no início da iteração n, tem-se j + 1 = n e b = fibonacci(j + 1) = fibonacci(n). Como a condição para a execução do laço é falsa quando i = n + 1, então o laço termina e o algoritmo retorna b = fibonacci(n).

Multiplicação iterativa 1 Algoritmo multiplica(y, z) 2 x 0 3 enquanto z > 0 faça: 4 se z é ímpar então, 5 x x + y 6 y 2y 7 z z 2 8 retorna x Teorema: Se y, z N, o Algoritmo multiplica(y,z) retorna y z.

Multiplicação iterativa 1 Algoritmo multiplica(y, z) 2 x 0 3 enquanto z > 0 faça: 4 se z é ímpar então, 5 x x + y 6 y 2y 7 z z 2 8 retorna x Teorema: Se y, z N, o Algoritmo multiplica(y,z) retorna y z.

Multiplicação iterativa Resultado preliminar: Teorema: Para todo natural n, 2 n 2 + (nmod2) = n. Demonstração: Há dois casos: Caso 1: n é par. Então n 2 = n 2 e (nmod2) = 0 e o resultado segue.

Multiplicação iterativa Resultado preliminar: Teorema: Para todo natural n, 2 n 2 + (nmod2) = n. - Caso 2: n é ímpar. Então n 2 = n 1 2 e (nmod2) = 1 e o resultado segue.

Multiplicação iterativa Para todo natural j 0, sejam y j, z j e x j os valores das variáveis x, y e z no início de qualquer iteração j (na linha 3). Invariante do laço: Teorema: Para todo inteiro j 0, y j z j + x j = y 0 z 0. Demonstração: A prova é por indução em j. Base: j = 0: Nesse caso, x 0 = 0, então y 0 z 0 + x 0 = y 0 z 0

Multiplicação iterativa Hipótese de indução: Para um inteiro não-negativo k, y k z k + x k = y 0 z 0. Passo: Observe que x k+1 = x k + y k (z k mod2), pelas linhas 4 e 5. Então, y k+1 z k+1 + x k+1 = 2y k z k 2 + x k + y k (z k mod2) = = y k (2 z k 2 + (z k mod2)) + x k = (pelo resultado preliminar) = y k z k + x k = (pela hipotese de indução) = y 0 z 0

Multiplicação iterativa Prova de corretude Teorema: O Algoritmo multiplica(y,z) retorna y z. prova: O algoritmo termina, pois em cada iteração z é dividido pela metade e arrendondado para baixo se for ímpar. Logo, para alguma iteração t, z t = 0. Pela linha 8, o algoritmo retorna x t. Pela invariante do laço, y t z t + x t = y 0 z 0. Como z t = 0, tem-se x t = y 0 z 0 = yz