Buscar

Lista 2

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 4 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1 
 UNIVERSIDADE FEDERAL DE VIÇOSA 
 DEPARTAMENTO DE INFORMÁTICA 
 INF332 - Projeto e Análise de Algoritmos 
 Prof. José Elias C. Arroyo 
 
Lista de Exercícios 2 
Data de entrega: 10 de novembro de 2014 
 
1. Seja um array de n elementos (números). Deseja-se determinar o elemento que aparece o maior 
número de vezes no array. Caso todos os elementos do array são diferentes, a solução é o primeiro 
elemento que aparece uma vez. 
a) Escreva um algoritmo de força bruta para determinar uma solução do problema. Calcule a 
complexidade do algoritmo. 
b) Escreva um algoritmo de complexidade O(nlogn). 
 
2. Seja um array com n-1 elementos inteiros que estão na faixa 1 a n. Não existem elementos 
repetidos. No array um dos elementos está faltando. 
a) Escreva um algoritmo de força bruta para encontrar o elemento que está faltando no array. 
Calcule a complexidade do algoritmo. Exemplo, para n = 8: A = [4, 2, 7, 6, 3, 8, 1]. O 
elemento que está faltando é 5. 
b) Escreva um algoritmo de complexidade O(nlogn). 
c) Escreva um algoritmo de complexidade O(n). 
 
3. Dados dois arrays com n elementos (números) ordenados. Deseja-se determinar a mediana da 
união dos dois arrays (ou seja a mediana dos 2n elementos). 
Exemplo: Para A = [2, 3, 5, 6, 10] e B = [1, 7, 10, 13, 15] a mediana é (6+7)/2 = 6,5. 
a) Escreva um algoritmo de força bruta para resolver o problema. Calcule a complexidade do 
algoritmo. 
b) Escreva um algoritmo baseado na técnica Divisão e Conquista (D&C) para encontrar a solução 
do problema. Calcule a complexidade do algoritmo. 
 
4. Seja um conjunto M contendo n moedas (n>1), sendo que (n-1) são idênticas (válidas) e uma é 
falsa. Suponha que as moedas válidas pesam 1g e a falsa pesa 0,5g. O problema consiste em 
detectar a moeda falsa no conjunto M. Escreva três algoritmos diferentes baseadas, 
respectivamente, nas técnicas de Força Bruta, Indução, e D&C. Apresente a complexidade dos 
algoritmos. 
 
5. Escreva um algoritmo recursivo baseado na técnica de Indução para a ordenação por inserção de 
um array de n números reais. Calcule a complexidade do algoritmo. 
 
6. Problema da subsequência crescente máxima (ou mais longa): Seja uma sequencia de n números 
a = [a1, a2, ..., an]. Uma subsequencia de a é qualquer subconjunto s = [ai1, ai2, ..., aik] de números 
tomados em ordem, ou seja, 1 ≤ i1 < i2< ...<ik ≤ n. A subsequencia s é crescente se ai1< ai2< ... < 
aik, e é máxima se tem o maior número de elementos. 
Exemplo: para a = [5, 2, 8, 6, 3, 6, 9, 7], s = [5, 6, 9] é uma sequencia crescente com 3 
elementos. s = [2, 3, 6, 9] e s = [2, 3, 6, 7] são sequencias crescentes com 4 elementos. 
a) Escreva um algoritmo de força bruta para resolver o problema. Qual é complexidade do 
seu algoritmo? 
b) Escreva um algoritmo baseado em D&C para resolver o problema. Qual é complexidade 
do seu algoritmo? 
 
 2 
 
7. Seja um conjunto {p1, p2, ..., pn} de n (n ≥ 2) pontos no plano R2 (pi = (xi, yi)). Aplicando a técnica 
de D&C, escreva um algoritmo para determinar o par de pontos mais próximos (os dois pontos de 
menor distância euclidiana). Obs. Se o conjunto tiver n ≤ 3 pontos, os dois pontos mais próximos 
podem ser obtidos pelo método de foça bruta. Calcule a complexidade do algoritmo. 
 
8. Considere o problema de ordenação onde os vetores a serem ordenados, de tamanho n > 0, 
possuem ⌊n/2⌋ valores iguais a um número real x e ⌈n/2⌉ valores iguais a um outro número real y. 
Considere que os números reais x e y são conhecidos e fixos (dados de entrada), porém estão 
distribuídos aleatoriamente no vetor a ser ordenado. Responda as seguintes questões e justifique 
sua resposta: 
a) No pior caso, o Quicksort será o algoritmo mais eficiente para este problema, com tempo 
O(nlog2n) ? 
b) O algoritmo de ordenação por inserção sempre opera no melhor caso com tempo O(n)? 
c) O melhor algoritmo para este problema tem tempo O(n)? Caso sim, escreva o algoritmo. 
 
9. Escreva um algoritmo baseado na técnica D&C para determinar o número de níveis de uma 
árvore binária (se a árvore é vazia o número de níveis é zero). Determine a complexidade 
de tempo do seu algoritmo. 
 
10. Considere o problema da busca de uma chave x num vetor V com n elementos não 
ordenados (V[0..n-1]). O algoritmo da busca binária é baseada na técnica D&C. 
a) Escreva o algoritmo da busca binária baseado na técnica D&C. Determine a 
complexidade do algoritmo. 
b) Rescreva o algoritmo da busca binária para o problema da busca de uma chave x num 
vetor V ordenado e determine a complexidade do algoritmo. 
 
11. Seja x um número real e S = {x1, x2, ...., xn} uma lista de n números reais. 
a) Escreva um algoritmo de força bruta para determinar se a soma de dois elementos de S é igual 
a x. Calcule a complexidade do seu algoritmo. 
b) Escreva um algoritmo de complexidade O(nlog2n) para o mesmo problema. Mostre que a 
complexidade é O(nlog2n). 
 
12. Dada uma sequência S = {x1, x2, ...., xn} de n números. A multiplicidade de um elemento x de S é 
definida como sendo o número de vezes que este elemento ocorre na sequência. Além disso, um 
número z é dito a maioria da sequência se a sua multiplicidade é maior do que n/2. 
a) Escreva um algoritmo de força bruta que determina o número que é a maioria da sequência 
(se ele existir). Determine a complexidade do algoritmo. 
b) Escreva um algoritmo de complexidade O(nlog2n) para determinar a maioria da sequência. 
c) É possível projetar um algoritmo de complexidade Θ(n)? Caso sim escreva o algoritmo. 
 
13. Problema do troco: Seja d = {d1, d2,..., dn} um conjunto de n valores distintos (moedas) 
correspondentes a uma unidade monetária. Suponha que existe uma quantidade ilimitada de cada 
moeda para serem usadas. O problema do troco consiste em formar uma quantidade X utilizando o 
menor número de moedas. 
a) Escreva um algoritmo de força bruta para resolver o problema; 
b) Escreva um algoritmo baseado em uma estratégia gulosa para resolver este problema. 
Qual é complexidade do seu algoritmo? 
c) Seja d = { R$ 0,01; R$0,05; R$0,10; R$0,25; R$0,50; R$1,00; R$2,00; R$5,00; R$10,00; 
R$20,00; R$50,00; R$100,00} as moedas da unidade monetária brasileira. Utilizando seu 
 3 
algoritmo, determine as soluções para X = 49,78, X = 995,39 e X = 3149,32. Seu 
algoritmo gera a melhor solução possível? Caso não, apresente um contraexemplo. 
 
14. Apagando e Ganhando: Seja um número x de n dígitos, então devem ser apagados k dígitos 
desse número de tal forma que os números que restarem forme um número que equivale a 
um prêmio em dinheiro que você ganharia. Quais seriam os k dígitos a serem apagados para 
obter o maior prêmio? 
Exemplo: x = 671930, k = 3. Uma solução seria apagar 6, 1 e 0 obtendo 793. 
Escreva um algoritmo guloso de tempo O(n) para resolver o problema. 
 
15. Considere um conjunto H = {(starti , endi) : 1 ≤	
 i ≤ n} de n horários de aula. Estes horários 
correspondem a disciplinas que devem ser oferecidas em um dia da semana. A disciplina i 
demanda de uma sala de aula no horário (starti , endi). Deseja-se determinar o menor numero de 
salas de aula para atender todas as disciplinas. Escreva um algoritmo guloso para resolver o 
problema. 
 
16. Considere um serviço de atendimento ao cliente na qual n clientes estão numa fila. Suponha que 
cada cliente i requer um tempo ti (em minutos) para ser atendido (esse tempo é conhecido). 
Supondo que o funcionamento do serviço de atendimento inicia às 0:00h. De que maneira os 
clientes devem ser organizados na fila de tal maneira que o tempo total de espera de todos os 
clientes seja mínimo? O tempo de espera de um cliente i é S + ti, onde S é a soma dos tempos de 
atendimento dos clientes que foram previamente atendidos. Escrevaum algoritmo para resolver o 
problema. 
 
17. Suponha que temos n programas de computador {1,...,n} que resolvem problemas diferentes. 
Existe só uma máquina para executar os programas. Uma tarefa i demora ai horas para ser 
executado na máquina. Após a execução dos programas devem ser entregues os resultados dos 
mesmos. Seja pi o prazo para entregar o resultado do programa i. Este prazo é dado em horas e é 
contabilizado a partir do início da execução do primeiro programa. Se a execução de uma tarefa i 
finaliza após do prazo de entrega é produzido um atraso definido por: ci – pi, onde ci é o instante 
de finalização do programa i. Se ci – pi < 0 o atraso da tarefa será 0. Assumir um escalonamento 
não preemptivo, ou seja, os programas devem ser executados um por vez. O objetivo do problema 
é determinar o escalonamento dos programas (ordem de processamento) de tal maneira que seja 
produzido o menor atraso total (em horas). 
Considere o seguinte exemplo numérico: n = 5 programas, os tempos de execução e prazos 
são: a1 = 8, a2 = 15, a3 = 5, a4 = 9, a5 = 10; p1 = 7, p2 = 25, p3 = 20, p4 = 35, p5 = 27. 
Um possível escalonamento é executar os programas na seguinte ordem 1, 2, 3, 4, 5 (programa 1, 
programa 2, programa 3, programa 4, programa 5). Note que a execução do programa 1 terminará 
após de 8 horas (do inicio de funcionamento da máquina), e o resultado desse programa é para 
entregar no prazo de 7 horas. O programa 1 terá um atraso de 1h. A execução do programa 2 
finalizará depois de 23h, ou seja, não tem atraso, pois p2 = 25. As tarefas 3, 4 e 5 possuem atrasos 
de 8h, 2h e 22h, respectivamente. O atraso total produzido será: 0+0+8+2+22 = 32h. 
a) Escreva um algoritmo baseado numa estratégia gulosa para resolver o problema. 
b) Usando a estratégia gulosa, qual seria a solução do exemplo numérico apresentado acima? O 
atraso total obtido é o menor possível? Caso não, apresente um contraexemplo. 
c) Como seria um algoritmo de força bruta para obter a melhor solução do problema? 
 
18. Seja {B1, ..., Bn} um conjunto de n caixas todas com um mesmo peso p. Cada caixa Bi possui um 
custo ci. Escreva um algoritmo que dado um valor K, determina um subconjunto de caixas cujo 
peso é menor ou igual a K e tal que o custo total é máximo. 
 
 4 
19. Solitaire é um jogo num tabuleiro n×n para um único jogador. Cada campo do tabuleiro possui 
um número inteiro. O jogador começa escolhendo alguma posição do tabuleiro. Depois ele pode 
repetidamente mover uma posição para a direita ou uma posição para baixo. O jogo termina 
quando a próxima posição cai fora do tabuleiro (a ultima posição soma 0). O valor do jogo é igual 
à soma dos números visitados (incluindo a posição inicial). O objetivo é encontrar o jogo de maior 
valor. 
Por exemplo, no tabuleiro 
3 1 -4 1 
5 -1 9 2 
6 5 -3 -5 
-8 -9 -7 2 
começando da posição (2,3) com 9, indo para baixo, e depois para direita, baixo, direita ( ou 
baixo) obtêm-se uma solução com valor: 9 – 3 – 5 + 2 + 0 = 3. 
a) Escreva um algoritmo de força bruta para determinar o jogo de maior valor. Determine a 
complexidade do algoritmo. 
b) Escreva um algoritmo baseado numa estratégia gulosa. Determine a complexidade do 
algoritmo. Seu algoritmo determina a melhor solução?

Outros materiais