Análise de programas imperativos



Documentos relacionados
Ordenação e Pesquisa de Dados. Aula 07 Insertion Sort e Bubble Sort

PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C

Algoritmos e Modelação Computacional. Paulo Mateus MEBiom LMAC 2018

Ordenação de Vectores

PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C

Aulas de. Algoritmos e Modelação Matemática

BCC202 - Estrutura de Dados I

Algoritmos Paralelos - ordenação

Linguagem C: Algoritmos de Ordenação

Departamento de Informática - PUC-Rio INF 1005 Programação I P1 22/09/2010 Nota

Algoritmos de Pesquisa e Ordenação em Vectores

Capítulo 5: Repetições

Algoritmos de Ordenação Eficiência de Algoritmos

Algoritmos de ordenação Ordenação rápida ( Quicksort )

Isomorfismos de Grafos, Grafos Planares e Árvores

Algoritmos de Ordenação: QuickSort

AULA 3 Alocação dinâmica de memória: Ponteiros

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Algoritmos e Estrutura de Dados

Conjuntos Finitos e Infinitos

Estruturas de repetição. Objetivos: - Compreender diversos tipos de comandos de repetições disponíveis na linguagem C.

Métodos Formais. Agenda. Relações Binárias Relações e Banco de Dados Operações nas Relações Resumo Relações Funções. Relações e Funções

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - II

Simulado de Linguagem de Programação Java

Relatório das Provas da 2ª. Fase - Vestibular 2016

ATENÇÃO!!! Rui Morgado - TLP 2

Método de ordenação - objetivos:

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2

PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C

INTRODUÇÃO À PROGRAMAÇÃO II VARIÁVEIS COMPOSTAS HOMOGÊNEAS UNIDIMENSIONAIS

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

1. Estrutura de Dados

Matemática - Módulo 1

Vectores: Algoritmos de Ordenação. Algoritmos e Estruturas de Dados 2008/2009

APC1 Prof. Eduardo Exercícios (Lista 4 T3)

Análise de Algoritmos

UNIVERSIDADE DA BEIRA INTERIOR

Métodos de Ordenação: Selection, Insertion, Bubble, Merge (Sort)

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

9.1.2 Laços Controlados por Entrada: Contador

OBSERVAÇÕES: EXERCÍCIOS

Prof. Vania Gimenez.Notas de aula Lógica de programação- Este material não substitui os livros indicados no site no link bibliografia.

Aula 01 Introdução Custo de um algoritmo, Funções de complexidad e Recursão

ANÁLISE DE FALHAS DE COMPUTADORES

Analise o código abaixo:

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

Introdução a Funções

float vantagem(float candidato[], float concorrente[], int n);

Capacitação em Linguagem C Parte 2

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

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

03. [Sebesta, 2000] Descreva a operação de um gerador de linguagem geral.

3. COMPILAÇÃO E ESTRUTURA BÁSICA DE UM PROGRAMA EM C

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

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

Prova Escrita de MATEMÁTICA A - 12o Ano a Fase

I. Introdução à Análise de Algoritmos

Algoritmos de Ordenação

Referências. Programação de Computadores II. Cap. 7 Cadeias de Caracteres. Caracteres. Tópicos

Projeto e Análise de Algoritmos

UNIVERSIDADE DA BEIRA INTERIOR

5. Análise de Complexidade de Algoritmos. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2003/2004) Luís Paulo Reis (versão 2005/2006)

Linguagem C. Introdução à Programação C. Variáveis. Identificadores. Identificadores 12/03/2011 VARIÁVEIS E TIPOS DE DADOS

Q1 Q2 Q3 Nota. Departamento de Informática - PUC-Rio INF 1005 Programação I P2 20/10/2010. Aluno: Exemplo (apenas um exemplo!):

Tabela ASCII de caracteres de controle

Matemática para a Economia I - 1 a lista de exercícios Prof. - Juliana Coelho

Programação. MEAer. Bertinho Andrade da Costa. Instituto Superior Técnico. Introdução ao Pré-Processador. 2011/2012 1º Semestre

Conversão Visualg à C++ Prof. Paulo Cesar F. de Oliveira, BSc, PhD

BCC202 - Estrutura de Dados I

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

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Elementos de programação em C

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

1 Cálculo do valor à vista

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

INF 1010 Estruturas de Dados Avançadas

Transcrição:

Análise de programas imperativos AMC 2011/12 ì Paulo Mateus Departamento de Matemática IST 2012

Objectivos ì Noção de invariante e variante de um ciclo ì Prova (informal) da correção de algoritmos imperativos ì Algoritmos de ordenação ì Análise da complexidade dos algoritmos de ordenação ì Análise do pior caso ì Análise de caso médio suposições probabilísticas

Invariante ì Invariante na Lógica de Hoare: ì Def (informal): Uma asserção I diz-se um invariante para um ciclo while(g){ corpo se, quando for verificada no início do ciclo, também é verificada no fim de cada iterada do ciclo. ì ì Para tornar esta definição rigorosa era necessário definir: ì Estado do programa (valores das variáveis + estado do controlo) ì Sintaxe da lógica para os invariantes (primeira-ordem com predicados relevantes) ì Semântica Nesta disciplina opta-se, como é comum na literatura, por utilizar linguagem matemática informal para analisar os algoritmos imperativos.

Invariante - factorial #include <stdio.h> /* Exemplo: factorial com contador a decrescer*/ int main() { int i, r, n; scanf( %d,&n); r=1; i=n; n /* Invariante r = k i >=1 */ k=i while(i>=2) { r=r*i; i--; printf( O factorial de %d é %d.\n, n, r); return 0; Prop: O programa Exemplo2, se terminar, calcula o factorial.

void insertionsort(int V[], int n) { int i=1, j, aux; while(i < n){ aux=v[i]; j = i-1; while(j>=0 && V[j] >aux) { V[j+1] = V[j]; j--; V[j + 1] = aux; i++; return; Algoritmo da Inserção

Invariante - Inserção void insertionsort(int V[], int n) { int i=1, j, aux; /* Invariante 1: Os valores V[0]...V[i-1] estão ordenados e i<=n */ while(i < n){ aux=v[i]; j = i-1; /* Invariante 2: Os valores V[j+1],..,V[i]>= aux e j>=-1*/ while(j>=0 && V[j] >aux) { V[j+1] = V[j]; j--; V[j + 1] = aux; i++; return; Prop: A função insertionsort ordena por ordem crescente o vector V.

Variante ì Def. Uma relação (A,<) é bem fundada se qualquer subconjunto não vazio B de A tem elemento minimal. ì Def. Um variante de um ciclo while(g){c e invariante I é um mapa dos estados que satisfazem I para o suporte A de uma relação bem fundada (A,<) cujo valor decresce estritamente em relação a < por cada iterada do ciclo.

Variante ì Regra da correção total do cálculo de Hoare Teo: Dado um invariante I, um ciclo while termina sse existe um variante para esse ciclo e I. Def: Um variante diz-se natural se o suporte da relação bemfundada for um subconjunto dos números naturais. Teo: Ciclos while com variantes naturais não são universais no que diz respeito a algoritmos computáveis à Turing.

Variante- factorial #include <stdio.h> /* Exemplo: factorial com contador decrescente*/ int main() { int i, r, n; scanf( %d,&n); r=1; i=n; /* Variante ({1...n,<) e f: {σ:σ[i]<=nè {1...n tq f(σ)=σ[i] */ while(i>=2) { r=r*i; i--; printf( O factorial de %d é %d.\n, n, r); return 0; Prop: O programa factorial termina para todo o input. Exer: Encontre variantes para os ciclos do insertionsort.

void insertionsort(int V[], int n) { int i=1, j, aux; while(i < n){ aux=v[i]; j = i-1; while(j>=0 && V[j] >aux) { V[j+1] = V[j]; j--; V[j + 1] = aux; i++; return; Algoritmo da Inserção

Análise no pior caso - inserção void insertionsort(int V[], int n) { int i=1, j, aux; while(i < n){ aux=v[i]; j = i-1; while(j>=0 && V[j] >aux) { V[j+1] = V[j]; j--; V[j + 1] = aux; i++; return; Análise do pior caso: Time(insertionSort(V,n)= # n 1 i 1 & O % 1 ( = O # n 1 i & # % ( = O 1 & % n(n 1) ( = O(n 2 ) $ i=1 j=0 ' $ i=1 ' $ 2 ' Análise do melhor caso: BTime(insertionSort(V,n)= # n 1 & O% 1( = O n 1 $ ' i=1 ( ) = O(n)

Análise no caso médio - inserção ì Para proceder a análise do caso médio é necessário fazer suposições probabilísticas sobre a entrada de dados. ì Diferentes suposições probabilísticas podem levar a diferentes comportamentos médios. ì A análise corresponde a calcular o valor esperado da complexidade temporal tendo em linha de conta a distribuição de probabilidades das entradas

Análise no caso médio - inserção void insertionsort(int V[], int n) { int i=1, j, aux; while(i < n){ aux=v[i]; j = i-1; while(j>=0 && V[j] >aux) { V[j+1] = V[j]; j--; V[j + 1] = aux; i++; return; Análise do caso médio: - Assume que no segundo ciclo poderá terminar com j=-1,0,.,i-1 equiprovavelmente. - O segundo ciclo é iterado i i j j p( j) = = i j=0 j=0 i +1 2 - ATime(insertionsort(V,n))= # O% $ n 1 i=1 i & # ( = O% 2 ' $ n 1 i=1 i & # ( = O 1 & % n(n 1) ( = O(n 2 ) 2 ' $ 4 '

void BubbleSort(int V[], int n) { int i=1, j, aux; while(i < n){ j = 0; while(j<n-i) { if(v[j+1] < V[j]) { aux=v[j]; V[j]=V[j+1]; V[j+1]=aux; ; j++; i++; return; Algoritmo Bubblesort

Algoritmo Bubblesort void BubbleSort(int V[], int n){ int i=1, j, aux; /* I1: V[n-i+1]...V[n-1] está ordenado e tem os maiores elementos de V e i<=n+1 */ while(i <= n){ j = 0; /* I2: V[j]é o maior valor de V[0]...V[j] de V e j<=n-i*/ while(j<n-i) { if(v[j+1] < V[j]) { aux=v[j]; V[j]=V[j+1]; V[j+1]=aux; j--; i++; return;

Algoritmo Bubblesort void BubbleSort(int V[], int n){ int i=1, j, aux; /* I1: V[n-i+1]...V[n-1] está ordenado e tem os maiores elementos de V e i<=n+1 */ while(i <= n){ j = 0; i++; return; /* I2: V[j]é o maior valor de V[0]...V[j] de V e j<=n-i*/ while(j<n-i) { if(v[j+1] < V[j]) { j--; aux=v[j]; V[j]=V[j+1]; V[j+1]=aux; Pior, melhor e caso médio? O(n^2)

Algoritmo QuickSort void quicksort(int vec[], int left, int right) { int r; if (right > left) { r = partition(vec, left, right); /* pivot */ quicksort(vec, left, r - 1); quicksort(vec, r + 1, right);

int partition(int vec[], int left, int right) { int i, j; i = left; j = left + 1; while( j <= right) { if (vec[j] < vec[left]) { ++i; swap(vec,i,j); j++; swap(vec,left, i); return i; Algoritmo QuickSort

void swap(int vec[] a, b) { int tmp; tmp = vec[a]; vec[a] = vec[b]; vec[b] = tmp; Algoritmo QuickSort

Algoritmo QuickSort void quicksort(int vec[], int left, int right) { int r; if (right > left) { r = partition(vec, left, right); /* pivot */ quicksort(vec, left, r - 1); quicksort(vec, r + 1, right);

Algoritmo QuickSort Correção por indução! Análise de complexidade por resolução de recurrências?