Pós-Graduação em Computação – Estrutura de Dados e Algoritmos Profa Cristina Boeres – Lista 1 1. Diz-se que um número inteiro n é um quadrado perfeito se existirem m números ímpares consecutivos a partir do valor 1 cuja soma é igual a n. Exemplo: 16=1+3+5+7 (16 é igual a soma dos quatro primeiros ímpares a partir de 1). Logo 16 representa um quadrado perfeito. Faça um programa que verifique se um valor inteiro positivo fornecido pelo usuário é um quadrado perfeito ou não. Especifique as estruturas de dados necessárias e a complexidade do algoritmo. 2. O “modo” de um conjunto é o elemento que aparece mais vezes. Exemplo: o conjunto {2,7,8,6,8} tem modo 8. Descreva um algoritmo para achar o modo de um conjunto com n elementos. Procure projetar o algoritmo da forma mais eficiente que você conseguir. Calcule sua complexidade. Em caso de empate, o algoritmo fornece qualquer um dos elementos empatados. Assuma que os elementos do conjunto foram armazenados em uma lista com n elementos. 3. Considere uma quantia em reais aplicada por n anos consecutivos, a uma taxa anual de juros j, com reinvestimento dos juros ao longo do período. A quantia final a ser resgatada após n anos é calculado da seguinte forma: gf = q * (( 1 + j/100) + ( 1 + j/100) 2 + … + ( 1 + j/100) n). Escrever um programa que calcule os resgates finais de acordo com as operações de aplicação fornecidas pelo usuário. 4. Escreva um procedimento eficiente para trocar a ordem de dois elementos consecutivos xi e xi+1 de uma lista x = ( x1 , x2 , ..., xn ), representada na forma de uma lista encadeada simples. Os dados de entrada são apenas o endereço L do primeiro elemento da lista, e o valor i que indica a posição de xi na lista. O procedimento deve retornar o endereço do primeiro elemento da lista, após a troca. Forneça a complexidade de sua proposta. 5. Suponha que temos uma estrutura de dados que armazena uma lista F = ( f1 , f2 , ..., fn ) de filas, cada fila sendo implementa por lista encadeada. Qual a representação mais adequada para essa estrutura, para que as operações possam ser efetuadas de maneira mais rápida possível (defina a estrutura de dados, seus campos necessários) ? Faça o procedimento Insere (valor, i ), onde i indica que a inserção deve ser feita na i-ésima fila. Faça o procedimento x = Remove (i ), onde i indica que a remoção deve ser realizada na i-ésima fila. Faça o procedimento x = Consulta (i ), onde i indica que a i-ésima fila deve ser consultada. 6. Um colega diz que descobriu um novo algoritmo de pesquisa super-eficiente com implementação recursiva de complexidade T(n) = 3T(n/3) + n e com custo constante para tamanho 1. Você recomendaria que ele implementasse o algoritmo? Porque? 7. (Algoritmos não-recursivos) Determine a função de complexidade (no pior e melhor caso), das funções implementadas em C, apresentadas abaixo, fazendo as considerações pertinentes. Os algoritmos estão corretos? Implemente-os. void BubbleSort1 ( int ∗ A, int n ){ int i , j ; int aux ; for ( j = 0 ; j < n ; j++ ){ for ( i = 0 ; i < n − 1 ; i++ ){ if ( A[ i ] > A[ i +1] ){ aux = A[ i ] ; A[ i ] = A[ i +1]; A[ i +1] = aux ; } } } } void BubbleSort2 ( int ∗ A, int n ) { int i , troca ; int aux ; do{ troca = 0 ; for ( i = 0 ; i < n−1 ; i++ ){ if ( A[ i ] > A[ i +1] ){ aux = A[ i ] ; A[ i ] = A[ i +1]; A[ i +1] = aux ; troca = 1 ; } } } while (troca) ; } void SelectionSort( int ∗ A, int n ) { int i , j , min ; int aux ; for ( i = 0 ; i < n − 1 ; i++ ){ min = i ; for ( j = i + 1 ; j < n ; j++ ) if ( A[ j ] < A[ min ] ) min = j ; aux = A[ min ] ; A[ min ] = A[ i ] ; A[ i ] = aux ; } } } void InsertionSort ( int ∗ A, int n ){ int j ; for ( int i = 1 ; i < n ; i++){ aux = A[ i ] ; j=i−1; while ( ( j >= 0 ) && ( aux < A[ j ] ) ){ A[ j + 1 ] = A[ j ] ; j −−; } A[ j + 1 ] = aux ; } } Exercícios sugeridos do livro de Szwarcfiter e Markenzon: Capítulo 1: 1, 2, 3, 14, 20 e 23. Capítulo 2 : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 26, 27. Exercícios sugeridos do Cormen: de acordo com a matéria dada em sala de aula