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.