I. Correção de Algoritmos Não-Recursivos

Documentos relacionados
Trabalho Prático 1. Valor: 1,0 pontos (10% da nota total) Data de Entrega: 02/05/2010

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

1 a Lista de Exercícios

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

Lista 2 - PMR2300/3200

EEL470 Algoritmos e Estruturas de Dados Prof. Heraldo L. S. Almeida Prova 1 (22/05/2009)

LISTA DE EXERCÍCIOS 1

LISTA DE EXERCÍCIOS 1

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Lista 1. 8 de abril de Algorithms: Capítulo 0, exercícios 1 e 2. Tardos: Todos exercícios do cap 2 do livro texto, exceto 7 e 8 letra b.

CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.

Complexidade de Algoritmos

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

Análise de algoritmos

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Análise e Complexidade de Algoritmos

Técnicas de análise de algoritmos

1 a Lista Professor: Claudio Fabiano Motta Toledo Estagiário PAE: Jesimar da Silva Arantes

Complexidade de Algoritmos

Solução de Recorrências

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

Classes, Herança e Interfaces

Prova 1 PMR2300 / PMR3201 1o. semestre 2015 Prof. Thiago Martins

Algoritmos de Ordenação

Estruturas de Dados 2

5. Invólucros Convexos no Plano (cont )

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

COMPLEXIDADE DE ALGORITMOS

Análise de Algoritmos

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Análise e Complexidade de Algoritmos

Aula 1. Teoria da Computação III

Análise de algoritmos

Lista de Exercícios 6: Soluções Funções

Projeto e Análise de Algoritmos

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

Algoritmos de ordenação Quicksort

Capítulo 6 Análise de Algoritmos Capítulo 6

Quantidade de memória necessária

Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

Projeto e Análise de Algoritmos

Técnicas de projeto de algoritmos: Indução

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

Análise de algoritmos

Ordenação em tempo linear

Teoria da Computação. Aula 3 Comportamento Assintótico 5COP096. Aula 3 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

FACULDADE CAMPO LIMPO PAULISTA BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto a Análise de Algoritmos I Lista de Exercícios 1

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

Estruturas de Dados Algoritmos

Técnicas de projeto de algoritmos: Indução

ANÁLISE DE ALGORITMOS: PARTE 3

BCC202 - Estrutura de Dados I

Lista de Exercícios 6 Funções

Algoritmos e Estrutura de Dados. Aula 04 Recorrência Prof. Tiago A. E. Ferreira

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

Prova 1 PMR3201 Computação para Automação 1o. semestre 2016 Prof. Thiago de Castro Martins

ORDENAÇÃO POR INTERCALAÇÃO

CT-234. Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

UNIVERSIDADE DA BEIRA INTERIOR

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Análise de Algoritmos Parte 4

Melhores momentos AULA 1. Algoritmos p.38/86

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

Construção de Algoritmos II Aula 06

ANÁLISE DE ALGORITMOS

ALGORITMOS E ESTRUTURAS DE DADOS 2011/2012 ANÁLISE DE ALGORITMOS. Armanda Rodrigues 3 de Outubro 2011

BCC202 - Estrutura de Dados I

COMPLEXIDADE DE ALGORITMOS COMPLEXIDADE DE ALGORITMOS

Estruturas de Dados 2

Análise de Algoritmos

Fabio G. Cozman, Thiago Martins 2017

SCC Capítulo 3 Análise de Algoritmos - Parte 2

Aula 06: Análise matemática de algoritmos recursivos

Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:

Ordenação por Intercalação Métodos de Ordenação Parte 4

Algoritmos de Ordenação: QuickSort

Lista de março de 2014

Comportamento Assintótico. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Análise de algoritmos. Parte I

Programação Estruturada

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

Luís Fernando Schultz Xavier da Silveira. 12 de maio de 2010

Projeto de Algoritmos e Indução Matemática

Aula 2. Divisão e conquista. Exemplo 1: Número de inversões de uma permutação (problema 2-4 do CLRS; veja também sec 5.4 do KT)

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Universidade Federal do ABC Avaliação Disciplina Turma Professor Data Instruções para a prova (leia antes de começar): SelectionSort selectonsortrec

Melhores momentos AULA 3. Algoritmos p.148/188

Projeto e Análise de Algoritmos

Algoritmos e Estruturas de Dados I Prof. Tiago Eugenio de Melo

Análise de Algoritmos Estrutura de Dados II

7. Introdução à Complexidade de Algoritmos

Complexidade de Algoritmos

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

INF 1010 Estruturas de Dados Avançadas

Carlos Eduardo Batista. Centro de Informática - UFPB

Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia

Introdução à Análise Algoritmos

Transcrição:

I. Correção de Algoritmos Não-Recursivos Nos exercícios a seguir, você deverá demonstrar a correção dos algoritmos por meio dos conceitos vistos nos slides da Aula 03. 1) Prove que o seguinte algoritmo para efetuar a exponenciação de números naturais está correto: unsigned power(unsigned a, unsigned b) x = 1; while (b > 0) x = x * a; b = b 1; return x; 2) Prove que o seguinte algoritmo para determinar o quadrado de um número natural está correto: unsigned quadrado(unsigned a) x = 0; i = 0; while (i < a) x = x + a; i = i + 1; return x; 3) Prove que o seguinte algoritmo para calcular o fatorial de um número natural está correto: unsigned fatorial(unsigned a) x = 1; i = 1; while (i <= a) x = x * i; i = i + 1; return x; 4) Prove que o seguinte algoritmo para calcular o produto de dois números naturais está correto: unsigned fatorial(unsigned a, unsigned b) x = 0; while (b > 0) if (b%2) x = x + a; x = 2 * x; b = b / 2; return x;

5) Considere o seguinte algoritmo para ordenar n números armazenados em um arranjo A, conhecido como ordenação por seleção : Localizar o menor elemento de A e permutar esse elemento com o elemento contido em A[0]. Em seguida, encontrar o segundo menor elemento de A e permutá-lo com o elemento A[1]. Proceder dessa maneira para os primeiros n 1 elementos de A. a) Escreva uma função em linguagem C para implementar este algoritmo. b) Demonstre a correção deste algoritmo, enunciando e demonstrando a validade de propriedades invariantes para os dois laços do algoritmo. c) Explique por que ele só precisa ser executado para os primeiros n 1 elementos, e não para todos os n elementos. 6) O bubblesort é um algoritmo de ordenação popular, que opera permutando repetidamente elementos adjacentes que estão fora de ordem. Observe a implementação do algoritmo bubblesort em linguagem C listada abaixo: void bubblesort(float A[], int n) for (i=0; i<n; i++) for (j=n-1; j>=i+1; j--) if (A[j] < A[j-1]) aux = A[j]; A[j] = A[j-1]; A[j-1] = aux; a) Enuncie uma propriedade invariante mantida pelo laço for interno e demonstre sua validade. b) Usando a condição de término garantida pela propriedade invariante que você enunciou e demonstrou no item anterior para o laço for interno, enuncie e demonstre uma propriedade invariante do laço for externo que garanta que, ao final do algoritmo, os elementos do vetor A estarão dispostos em ordem crescente. Dica: Seja A o arranjo resultante produzido pelo algoritmo, é necessário demonstrar que: A é uma permutação válida de A A [0] A [1]... A [n 1]

II. Limites Assintóticos de Funções Nos exercícios a seguir, você trabalhará com os conceitos de limites assintóticos abordados nos slides da Aula 05 do curso. 7) Determine um limite assintoticamente restrito para a função n 3 /1000 100n 2 100n + 3 em termos da notação Θ e demonstre este limite. 8) Mostre que log= Θlog 9) Sejam f(n) e g(n) funções assintoticamente não negativas. Usando a definição básica da notação Θ, prove que max(f(n), g(n)) = Θ(f(n) + g(n)). 10) Mostre que, para quaisquer constantes reais a e b, onde b > 0, + = 11) É verdade que 2 = O(2 )? Justifique. 12) É verdade que 2 = O(2 )? Justifique. 13) Podemos estender nossa notação ao caso de dois parâmetros n e m que podem tender a infinito independentemente a taxas distintas. Para uma dada função g(n,m), denotamos por O(g(n,m)) o conjunto de funções O(g(n,m)) = f(n,m) : existem constantes positivas c, e tais que 0 f(n, m) c.g(n,m) para todo n e m. Forneça definições correspondentes para Ωg(n,m)) e ϴ(g(n,m)). 14) A função! é polinomialmente limitada? Justifique. 15) A função! é polinomialmente limitada? Justifique. 16) Ordene as funções a seguir por ordem de crescimento; ou seja, encontre um arranjo gl, g2,..., g30 das funções que satisfazem a gl = Ω (g2), g2 = Ω (g3),..., g29 = Ω (g30) Particione sua lista em classes de equivalência tais que f(n) e g(n) estejam na mesma classe se e somente se f(n) = Θ(g(n)). Obs: a função lg significa log2.

17) Para cada afirmação abaixo, determine se ela é sempre verdadeira, nunca verdadeira, ou às vezes verdadeira e às vezes falsa para as funções assintoticamente não-negativas f e g. Se for sempre verdadeira ou nunca verdadeira, demonstre o motivo. Se for às vezes verdadeira e às vezes falsa, dê um exemplo em que é verdadeira e outro em que é falsa. a) = b) + =ϴmax, c) + =ϴ d) =Ω = e) 18) Verifique se a afirmação abaixo é verdadeira ou falsa. Justifique sua resposta. Sejam f e g funções assintoticamente não negativas. Então pelo menos uma dentre as relações f(n) = O(g(n)) e g(n) = O(f(n)) deve ser sempre verdadeira.

III. Análise Assintótica de Algoritmos Não-Recursivos Nos exercícios a seguir, você exercitará as técnicas de análise assintótica de algoritmos abordadas nos slides da Aula 05 do curso. 19) Considere o seguinte algoritmo para ordenar n números armazenados em um arranjo A, conhecido como ordenação por seleção : Localizar o menor elemento de A e permutar esse elemento com o elemento contido em A[0]. Em seguida, encontrar o segundo menor elemento de A e permutá-lo com o elemento A[1]. Proceder dessa maneira para os primeiros n 1 elementos de A. a) Escreva uma função em linguagem C para implementar este algoritmo (ver item a do exercício 5). b) Forneça limites assintóticos justos inferior (melhor caso) e superior (pior caso) para o tempo de execução deste algoritmo, usando as notações Ω e O. 20) Observe o algoritmo abaixo para ordenar n números armazenados em um arranjo A, onde um laço while é utilizado para fazer uma pesquisa sequencial varrendo o sub-arranjo A[0 j 1] de trás para frente à procura de um elemento maior que a chave A[j]: void insertionsort(float A[], int n) for (j=1; j<n; j++) chave = A[j]; i = j-1; while (i>0 && A[i]>chave) A[i+1] = A[i]; i = i-1; A[i+1] = chave; a) Forneça limites assintóticos justos inferior (melhor caso) e superior (pior caso) para o tempo de execução deste algoritmo, usando as notações Ω e O. b) Repare que, em cada iteração j do laço for externo, os elementos do sub-arranjo A[0 j 1] já estão ordenados. Verifique se é possível reduzir a complexidade de pior caso deste algoritmo para O(n.log(n)) se a pesquisa sequencial implementada no laço while for substituída por uma pesquisa binária. Justifique sua resposta.

21) O bubblesort é um algoritmo de ordenação popular, que opera permutando repetidamente elementos adjacentes que estão fora de ordem. Observe a implementação do algoritmo bubblesort em linguagem C listada abaixo: void bubblesort(float A[], int n) for (i=0; i<n; i++) for (j=n-1; j>=i+1; j--) if (A[j] < A[j-1]) aux = A[j]; A[j] = A[j-1]; A[j-1] = aux; a) Forneça limites assintóticos justos inferior (melhor caso) e superior (pior caso) para o tempo de execução deste algoritmo, usando as notações Ω e O. b) De que forma o laço for externo poderia ser modificado (sem nenhuma mudança no laço for interno) de modo a melhorar substancialmente o comportamento assintótico do algoritmo no melhor caso (arranjo de entrada previamente ordenado)? c) Qual seria o novo limite assintótico inferior justo após essa modificação?

IV. Implementação de Algoritmos Recursivos em C Os exercícios a seguir são um treinamento para você exercitar seu raciocínio na elaboração de algoritmos recursivos e também na implementação desses algoritmos em linguagem C. Todas as funções solicitadas nesses exercícios devem ser implementadas em linguagem C, sendo proibido o uso de estruturas de controle de laço (while e for). Chamadas recursivas devem ser sempre utilizadas em lugar de laços. Sugere-se o uso das técnicas descritas nos slides da Aula 06 do curso. Em alguns exercícios, pode ser conveniente reutilizar funções recursivas construídas em exercícios anteriores. 22) Escreva uma função recursiva que retorne a soma de todos os números naturais entre 1 e um número natural n. 23) Escreva uma função recursiva que retorne a soma de todos os números naturais que sejam múltiplos de 3 entre 1 e um número natural n. 24) Generalize a função recursiva do exercício anterior para trabalhar com múltiplos de 3 entre os números naturais m e n. 25) Generalize ainda mais a função recursiva do exercício anterior para trabalhar com múltiplos de um número natural k entre m e n. 26) Escreva uma função recursiva que retorne o valor do dígito mais significativo de um número natural n. 27) Escreva uma função recursiva que retorne a quantidade de dígitos de um número natural n. 28) Escreva uma função recursiva que retorne a soma de todos os dígitos de um natural n. 29) Escreva uma função recursiva que determine se um número natural é palíndrome (exemplos de números palíndromes : 12421 e 123321). Sugestão: tente uma estratégia de recursividade baseada no resultado obtido para o número correspondente ao argumento de entrada sem os dígitos mais e menos significativos. 30) Escreva uma função recursiva que determine se um número natural m pertence a um número natural n (exemplos: 12 pertence a 490127, mas 327 não pertence a 490127). 31) Idem ao exercício anterior, mas sem ser necessário que os dígitos de m estejam contíguos em n (exemplos: 12 e 469 pertencem a 34166729, mas 327 não pertence a 234125). 32) Escreva uma função recursiva que retorne o valor do maior dígito de um natural n. 33) Escreva uma função recursiva que determine se todos os dígitos de um número natural n estão em ordem crescente.

34) Escreva uma função recursiva que determine se as somas de todos os pares de dígitos diametralmente opostos de um número natural n são as mesmas. Por exemplo, as somas em 13524 são as mesmas pois 1+4=3+2=5. Sugestão: a mesma fornecida para o exercício dos palíndromes. 35) Escreva uma função recursiva que retorne o valor correspondente a um número natural n com os seus dígitos reorganizados em ordem reversa. 36) Escreva uma função recursiva que determine se todos os dígitos de um número natural n são pares. 37) Escreva uma função recursiva para rodar os dígitos de um número natural n para a direita um total de k vezes. Por exemplo, rodar o número 23412 para a direita 3 vezes resulta no número 41223. 38) Escreva uma função recursiva para deslocar os dígitos de um número natural n para a direita um total de k vezes descartando o dígito menos significativo a cada deslocamento. Por exemplo, deslocar o número 23412 para a direita 3 vezes resulta no número 23. 39) Escreva uma função recursiva para determinar se todos os dígitos de um número natural n são potências de 2. 40) Escreva uma função para determinar o k-ésimo maior dígito de um número natural n. 41) Escreva uma função que subtraia uma unidade de cada dígito de um número natural n. Por exemplo, para o número 4312 a sua função deve retornar como resultado o número 3201. Suponha que o seu número não contém dígitos 0. 42) Escreva uma função recursiva para multiplicar todos os dígitos de um número natural n. Por exemplo, para o número 3459 a sua função deve retornar 3 4 5 9, isto é, 540. 43) Escreva uma função recursiva que determine quantas vezes um dígito k ocorre em um número natural n. Por exemplo, o dígito 2 ocorre 3 vezes em 762021192. 44) Escreva uma função para determinar a maior soma de dígitos diametralmente opostos de um número natural n. 45) 26. Escreva uma função para determinar o menor número de vezes que eu tenho que rodar para a direita os dígitos de um número natural n de tal forma a obter o próprio número novamente. Por exemplo, rodando 2 vezes os dígitos do número 272727 este mesmo número é obtido como resultado. 46) Escreva uma função recursiva que determine se as somas dos dígitos diametralmente opostos de um número inteiro estão em ordem crescente de fora para dentro. Por exemplo: 2534 e 25934 têm essa propriedade, pois 2+4 = 6 < 5+3 = 8 < 9. 47) Escreva uma função para determinar se todas as somas dos dígitos diametralmente opostos de um número inteiro são números pares (neste caso 2534 tem essa propriedade, mas 25934 não).

V. Correção de Algoritmos Recursivos Nos exercícios a seguir, você deverá demonstrar a correção dos algoritmos recursivos pelo método indutivo abordado nos slides da Aula 06. 48) Prove por indução as afirmativas abaixo: a) Para todo 1, 1 2 = 1 2 3/4 b) Para todo 0, 2+1 = c) Para todo 1, = +1/2 d) Para todo 0, é divisível por 5. e) Para todo 0, = 1, sendo o n-ésimo número de Fibonacci. 49) Demonstre pelo método indutivo que o seguinte algoritmo recursivo retorna o valor 5 3, para todo 0. float g(float n) if (n<=1) return 2*n; return 8*g(n-1) 15*g(n-2); 50) Descreva uma implementação recursiva (em pseudo-código ou em linguagem C) para os algoritmos abaixo e demonstre sua correção pelo método indutivo: a) Busca Binária b) Ordenação por Inserção c) Ordenação por Intercalação

VI. Resolução de Recorrências Nos exercícios a seguir, você deverá solucionar as recorrências pelos métodos abordados nos slides da Aula 06. 51) Sejam a, b e c constantes não negativas. Prove que a solução para 1= c Tn= a.t/b + c.n =1 >1 para n uma potência de b é: On, a <, T(n) = On log n, a = b, On, a > 52) Resolva as equações de recorrência : a) b) Tn= 2T + n, para n > 1 T1=27 Tn = 7Tn/2 + n, para n > 1 T1 = 0 Tn= T n+ log n, para n 1 c) T1 = 1 Dica: use mudança de variáveis. 53) Usando substituição, resolva as recorrências : a) Mostre que a solução para T(n) = 2T( n/2 ) + 17 é O(n lg n). b) T(n) = 2T( n) + 1 54) Resolva assintoticamente as recorrências abaixo. Suponha T(n) constante para n pequeno. a) T(n) = 3T(n/2) + n lg n b) T(n) = 2T(n/2) + n/ lg n c) T(n) = 4T(n/2) + n lg n

55) Use indução matemática para mostrar que, quando n é uma potência exata de 2, a solução da recorrência 2 =2, = 2 + >2, >1 é = log. 56) Demonstre, com o auxílio de uma árvore de recursão, que a solução para a recorrência T(n) = T(n/3) + T(2n/3) + c.n, onde c é uma constante, é Ω(n.log(n)). 57) Use uma árvore de recursão para fornecer um limite assintoticamente restrito para a recorrência T(n) = T(.n) + T((1 ).n) + c.n, onde α é uma constante no intervalo 0 < < 1 e c > 0 também é uma constante. 58) Forneça limites assintóticos superiores e inferiores para T(n) em cada uma das recorrências a seguir. Suponha que T(n) seja constante para n suficientemente pequeno. Torne seus limites tão restritos quanto possível e justifique suas respostas. a) =2 + b) = + c) =16 + d) =7 + e) =7 + f) =2 + g) = 1+ h) = +1 i) =3 +log j) =5 + k) =4 + l) =3 +5+

m) =2 + n) = + + + o T=T 1+ p T=T 1+log q = 2+2log r = + s) = 2 + log t) = 3 + log u) = + 2 v) = + ϴloglogn w) = 10 + 17. x) = 7 + y) = + + 6046 z) = 2+ log aa) = + + ϴ bb) = +100 59) Considere a recorrência = + +. Use o método da substituição para encontrar o limite superior mais justo possível para a recorrência, utilizando a notação O.

60) Demonstre um limite superior o mais justo possível (notação O) na solução de cada recorrência a seguir: a) =2 + b) = + +5 c) = 89+ϴ1 >, <, 61) Use o método da substituição para provar um limite inferior justo (notação Ω) na solução da seguinte recorrência: =4 + 62) Verifique se a afirmação abaixo é verdadeira ou falsa e justifique sua resposta: A solução para a recorrência =3 +logé =ϴlog.

VII. Análise Assintótica de Algoritmos Recursivos Nos exercícios a seguir, você determinará limites assintóticos para algoritmos recursivos, determinando as recorrências que descrevem o tempo de execução destes algoritmos e resolvendo estas recorrências, pelos métodos abordados nos slides da Aula 06. 63) A ordenação por inserção pode ser expressa sob a forma de um procedimento recursivo como a seguir. Para ordenar um arranjo A[1... n], ordenamos recursivamente o sub-arranjo A[1... n 1] e em seguida inserimos o elemento A[n] no sub-arranjo ordenado A[0... n 1]. Escreva uma recorrência para o tempo de execução dessa versão recursiva da ordenação por inserção. 64) Embora a ordenação por intercalação funcione no tempo de pior caso ϴ(n.log(n)) e a ordenação por inserção funcione no tempo de pior caso ϴ ( ), os fatores constantes na ordenação por inserção a tornam mais rápida para n pequeno. Assim, faz sentido usar a ordenação por inserção dentro da ordenação por intercalação quando os subproblemas se tornam suficientemente pequenos. Considere uma modificação na ordenação por intercalação, na qual n/k sub-listas de comprimento k são ordenadas usando-se a ordenação por inserção e, em seguida, intercaladas com o uso do mecanismo padrão de intercalação, onde k é um valor a ser determinado. a) Mostre que as n/k sub-listas, cada uma de comprimento k, podem ser ordenadas através da ordenação por inserção no tempo de pior caso ϴ(n.k). b) Mostre que as sub-listas podem ser intercaladas no tempo de pior caso ϴ(n.Iog(n/k)). c) Dado que o algoritmo modificado é executado no tempo de pior caso ϴ(n.k + n.iog(n/k)), determine o maior valor assintótico (notação ϴ) de k como uma função de n para a qual o algoritmo modificado tem o mesmo tempo de execução assintótico que a ordenação por intercalação padrão. d) Como k deve ser escolhido na prática? 65) Para cada algoritmo abaixo, forneça a recorrência que descreve seu tempo de execução no pior caso e dê o seu tempo de execução no pior caso usando a notação ϴ. a) Busca Binária b) Ordenação por Inserção c) Ordenação por Intercalação

VIII. Construção de Algoritmos Eficientes Nos exercícios a seguir, você construirá algoritmos ótimos e/ou sujeitos a especificações de eficiência assintótica, utilizando os conhecimentos abordados nos slides da Aula 04, 05 e 06. 66) Considere o problema de construir um arranjo ordenado C[1...m+n] composto de m+n números distintos obtidos de dois arranjos ordenados A[1...m] e B[1...n]. a) Determine uma cota inferior para este problema, expressa em notação Ω. b) Construa um algoritmo ótimo para resolver este problema, ou seja, um algoritmo que tenha a cota inferior do problema como limite assintótico superior de seu tempo de execução de pior caso. 67) Considere um conjunto S com 2 números distintos. Diz-se que um par de números distintos x,y são próximos em S se max min,, ou seja, se a distância entre x e y é, no máximo, a distância média entre números consecutivos ordenados. a) Explique brevemente porque todo grupo S com 2 números distintos contém um par de elementos próximos em S. b) Suponha que particionemos S em torno de um elemento pivô, organizando o resultado em dois subgrupos = e =. Prove que, para algum 1,2, existe um par x, y de números que são próximos em S (e não somente em Sk). c) Descreva um algoritmo de tempo O(n) para encontrar um par de números próximos em S (Dica use a estratégia dividir para conquistar ). d) Analise seu algoritmo, demonstrando o limite superior assintótico O(n). 68) Seja A[l...n] um arranjo de n números distintos. Se i < j e A[i] > A[j], então o par ( i, j ) é chamado uma inversão de A. a) Liste as cinco inversões do arranjo 2, 3, 8, 6, 1. b) Qual arranjo com elementos do conjunto 1, 2,..., n tem o número máximo de inversões? Quantas inversões ele tem? c) Qual é o relacionamento entre o tempo de execução da ordenação por inserção e o número de inversões no arranjo de entrada? Justifique sua resposta. d) Construa um algoritmo que determine o número de inversões em qualquer permutação sobre n elementos no tempo do pior caso de ϴ(n.Iog(n)). Sugestão: modifique a ordenação por intercalação.

69) Um vetor A[1..n] é unimodal se consiste de uma sequência crescente seguida de uma sequência decrescente, ou mais precisamente, se existe um índice m 1,2,, tal que <+1 1 < >+1 < Em particular, A[m] é o maior elemento, e é, também, o único máximo local rodeado por elementos menores (A[m-1] e A[m+1]). a) Construa um algoritmo para determinar o maior elemento de um vetor unimodal A[1..n] em tempo O(log n). b) Prove que o seu algoritmo está correto. c) Prove o limite superior assintótico de seu tempo de execução. Um polígono é convexo se todos os seus ângulos internos são menores que 180 o, como ilustrado na figura abaixo: Representa-se um polígono convexo como um vetor V[1..n] onde cada elemento do vetor representa um vértice do polígono na forma de um par ordenado (x,y). Sabe-se que V[1] é o vértice com a menor coordenada x e os vértices V[1..n] são ordenados no sentido horário, como mostra a figura. Deve-se assumir que as coordenadas x dos vértices são todas distintas entre si, assim como as coordenadas y o são. a) Construa um algoritmo para encontrar o vértice com a maior coordenada x em tempo O(log n). b) Construa um algoritmo para encontrar o vértice com a maior coordenada y em tempo O(log n). 70) Descreva um algoritmo de tempo ϴ(n.log(n)) que, dado um número x e um conjunto S composto de n números distintos, determine se existem ou não dois elementos em S cuja soma seja exatamente x. 71) Verifique se a afirmação abaixo é verdadeira ou falsa e justifique sua resposta: Um arranjo composto de n números cujos valores podem ser somente 1, 0 ou 1 pode ser ordenado em tempo de pior caso de O(n).

IX. Análise Assintótica Experimental No exercício a seguir, você estimará limites assintóticos e fará previsões a partir de medições experimentais construirá algoritmos ótimos e/ou sujeitos a especificações de eficiência assintótica, utilizando os conhecimentos abordados nos slides da Aula 04 e 05. 72) Três algoritmos (A, B e C) foram desenvolvidos para resolver um mesmo problema. A tabela abaixo mostra os tempos de processamento obtidos nos testes dos 3 algoritmos na resolução de problemas com tamanhos n=10, n=20, n=30 e n=40. Tamanho do Problema Algoritmo A ( hh:mm:ss ) Algoritmo B ( hh:mm:ss ) Algoritmo C ( hh:mm:ss ) n = 10 00:00:04 00:00:20 00:08:18 n = 20 00:00:32 00:01:20 00:16:36 n = 30 00:01:48 00:02:59 00:24:55 n = 40 00:04:15 00:05:19 00:33:13 a) Estime as taxas de crescimento dos três algoritmos, expressando-as na notação O. b) Estime o tempo de processamento que cada algoritmo consumiria na resolução de um problema de tamanho n=100 e n=1000. c) Qual dentre os três algoritmos é o mais recomendável para ser utilizado na resolução de problema de grande porte? E para problemas de tamanho pequeno e moderado?