1. Algoritmos Elementares

Propaganda
Instituto Superior de Engenharia de Lisboa
Licenciatura em Engenharia Informática e de Computadores
Algoritmos e Estruturas de Dados
Semestre de Inverno 2015/2016
Primeira série de exercícios
Observações:
• Data de entrega: 30 de Outubro de 2015.
• Não é permitida a utilização de algoritmos e estruturas de dados já existentes na biblioteca base da plataforma Java.
1.
Algoritmos Elementares
1. Realize o método estático,
public int findKthSmallest(int[] v1, int[] v2, int k)
que dados dois arrays v1 e v2 de inteiros, ordenados de modo crescente, retorna o k-ésimo elemento dos elementos
de ambos os arrays, em que k>=1. Quando não existem pelo menos k elementos no total dos elementos de ambos os
arrays, o método deverá lançar uma exceção do tipo NoSuchElementException. Indique justificando, a
complexidade do algoritmo.
Por exemplo, dados o array v1={2,4,6,7,11,14,21,24,25}, e o array v2={1,5,16,18}, se k=9, o método
retorna o valor 16 e se k=1, o método retorna o valor 1.
2. Realize o método estático,
public static int countInverses(String[] v, int l, int r)
que dado um subarray (v,l,r) de sequências de caracteres, retorna o número de sequências cuja inversa também está
presente no subarray. A sequência inversa de s=s1.s2…sn-1.sn é definida por s’=sn.sn-1…s2.s1.
Analise a complexidade assimptótica do algoritmo realizado.
3. Realize o método estático,
public static int partitionPoint(int[] v, int val)
que dado o array segmentado v com base em val, não necessariamente ordenado, retorna o índice do primeiro
elemento maior ou igual que val. Um array diz-se segmentado com base em val se todos os elementos menores que
val estiverem antes que os elementos maiores ou iguais que val. Caso todos os elementos sejam menores que val, deve
ser retornado a dimensão do array.
Por exemplo, dado o array {2,3,1,4,3,2,5,7,9,8}, segmentado com base em 5, o método deverá retornar 6
(índice do elemento 5). Caso a segmentação do array tenha sido feita com base em 6, o método deverá retornar 7 (índice
do elemento 7).
Valorizam-se soluções com custo assimptótico O(log(n)), em que n é a dimensão do array.
4. Realize o método estático,
public static int removeSmallerThan(int[] minHeap, int sizeHeap, int k)
que, recebendo um min-heap de dimensão sizeHeap, representado por minHeap, remove os elementos menores do
que k, retornando o número de elementos (count ) não removidos. Este método deve reorganizar o minHeap de forma a
que, após a sua execução, os primeiros count elementos sejam os elementos que não foram removidos e continuar a
representar um min-heap. Indique a complexidade assimptótica da sua solução.
2.
Análise de Desempenho
1. Considere o algoritmo xpto. Calcule, usando notação assimptótica o custo da sua execução em função de n.
xpto(v, n)
if (n <= 1) return
n=n/2
for(i=0; i<n; i=i+1)
v[i] = v[2i] + v[2i +1]
xpto(v, n)
1. Considere os algoritmos de ordenação estudados.
a.
Indique, justificando, um algoritmo cujo custo, quaisquer que sejam os valores presentes na sequência a ordenar,
pertence a O(n2) mas não pertence a Θ(n2).
b. Indique, justificando, um algoritmo cujo custo, quaisquer que sejam os valores presentes na sequência a ordenar,
pertence a O(n log n) mas não pertence a Θ(n log n).
c.
Indique uma desvantagem para cada um dos seguintes algoritmos de ordenação: merge-sort, quick-sort.
d. Um algoritmo de ordenação é parsimonioso se nenhum par de elementos é comparado mais do que uma
vez. Considerando as implementações das aulas e do livro recomendado da disciplina, quais dos seguintes
algoritmos de ordenação (insertion-sort, selection-sort, heap-sort e merge-sort) são
parsimoniosos? Justifique.
3.
Problema: Maior número de ocorrências em Ficheiros
Pretende-se desenvolver uma aplicação que permita determinar as k palavras que ocorrem mais vezes em n ficheiros
ordenados lexicograficamente, em que o número de palavras total em todos os ficheiros é m. Assuma que m >= 1.
O problema é descrito por:
• Um conjunto F = {f1, …, fn} de n ficheiros de texto, em que n > 0;
• Cada linha de um ficheiro fn tem uma palavra.
O objetivo da aplicação a desenvolver é a produção de um novo ficheiro de texto contendo as k palavras distintas que têm
um maior número de ocorrências.
Parâmetros de Execução
A aplicação a desenvolver terá de suportar as seguintes opções:
java -Xmx32m MaiorNrOccorrencias k outputFile sourceFiles ...
Esta opção corresponde à produção de um ficheiro de texto designado por outputFile contendo as k palavras que
ocorrem mais vezes em todos os ficheiros de texto sourceFiles. A opção -Xmx32m estabelece para o Java um heap
size máximo de 32 MB.
Por exemplo, dados os ficheiros de texto f1, f2 e f3, ordenados lexicograficamente, se executarmos:
java -XmX32m MaiorNrOccorrencias output.txt 10 f1.txt f2.txt f3.txt
iremos produzir um ficheiro de texto designado por output.txt, contendo as 10 palavras que ocorrem mais vezes nos
ficheiros de texto f1, f2 e f3.
Avaliação Experimental
Realize uma avaliação experimental do(s) algoritmo(s) desenvolvido(s) para a resolução deste problema. Como exemplo,
poderá utilizar os ficheiros que se encontram disponíveis juntamente com este enunciado. Apresente os resultados
graficamente, utilizando uma escala adequada.
ISEL, 06 de Outubro de 2016.
Download