Universidade de São Paulo Instituto de Ciências Matemáticas e Computação SCE5763 - Tipos e Estrutura de Dados - Luis Gustavo Nonato 2 a Lista de Exercícios 1. Seja A um array de inteiros. Escreva algoritmos recursivos para calcular os valores abaixo sem utilizar passagem de parâmetros por endereço: a) O maior elemento de A b) O menor elemento de A c) A soma dos elementos de A d) O produto dos elementos de A 2. Uma fila de números inteiros é armazenada em uma lista simplesmente encadeada. Defina uma estrutura de dados apropriada e construa os procedimentos para inserir, remover, iniciar na fila. 3. Repita o exercício anterior para uma pilha. 4. Considere uma lista circular duplamente encadeada. Defina uma estrutura de dados e construa procedimentos para incluir, remover e procurar por um elemento nesta lista. 5. Mostre como implementar uma pilha utilizando duas filas. Analise o tempo das operações PUSH e POP. 6. Considere duas listas simplesmente encadeada de números interios l 1 e l 2. (a) Crie uma lista l 3 que seja a união sem repetição de l 1 e l 2 (b) Crie uma lista l 4 que seja a interseção dos elementos que estão em l 1 e l 2 7. Construa um procedimento para inverter a ordem de uma lista simplesmente encadeda utilizando apenas duas variáveis auxiliares (não é permitido o uso de listas auxiliares). É possivel construir o procedimento utilizando apenas uma variável auxiliar? 8. Desejamos manipular polinômios do tipo p(x) = a 0 + a 1 x + a 2 x 2 + + a n x n. Tais polinômios podem ser representados por listas simplesmente encadeadas onde cada nó da lista possui três campos: um para o coeficiente que é um número real, um para o expoente que é um número inteiro e um campo que armazena um ponteiro para o próximo nó. Escreva programas para: Ler um polinômio e armazená-lo na lista, somar dois polinômios, multiplicar dois polinômios e derivar um polinômio. 1
9. Deque (fila de duas pontas) é uma estrutura de dados que consiste de uma lista na qual as seguintes operações são permitidas: a) PUSH(A) Insere o elemento A no início da deque. b) Pop() Remove o elemento que está no início da deque. c) Inject(A) Insere o elemento A no final da deque. d) Eject() Remove o elemento que está no final da deque. A fim de implementar as operações acima em tempo O(1) qual a melhor opção: lista sequêncial, lista simplesmente encadeada ou lista duplamente ecadeada? A partir de sua decisão, crie uma estrutura de dados e implemente as operações acima. 10. Considere o seguinte conjunto de números 1234 e as seguintes operações: (a) inserir o n o 1 em uma pilha (b) inserir o 2 na pilha (c) retirar o 2 da pilha (d) inserir o 3 na pilha (e) inserir o 4 na a pilha (f) retirar o 4 da pilha (g) retirar o 3 da a pilha (h) retirar o 1 da pilha. A sequência de saidas do procedimento acima é 2431. Considere agora a sequência 123456. a) Podemos obter as seqências 325641 e 154623 utilizando um processo semelhante ao do exemplo anterior? b) Se I e R representam respectivamente inserção e remoção da pilha o exemplo acima pode ser descrito como IIRIIRRR. Se possível descreva as sequências do item (a) em termos de I e R. c) Qual seria uma regra simples para anlisar se uma sequência de I s e R s é valida? d) Interprete a seguinte proposição: Existe uma permutação p 1 p 2... p n dos números 1234 n usando uma pilha se e somente se não existe índices i < j < k tal que p j < p k < p i. 11. Duas pilhas podem ser implementadas em um único array A da seguinte forma: A primeira pilha cresce a partir do início do array para direita e a segunda cresce a partir do final do array para a esquerda, ou seja, as pilhas crescem uma em direção a outra. Escreva os seguintes procedimentos: a) PUSH(A,i), onde A é o novo elemento a ser inserido na pilha i = 1,2. b) POP(i) que retorna o elemento que está no topo da pilha i = 1,2. 2
12. Podemos generalizar o problema anterior da seguinte forma: Considere N pilhas armazenadas em um único array A. Sejam Base[i] e Top[i] as posições da base e do topo da i-ésima pilha em A. As operações de inclusão e remoção na i-ésima pilha podem ser descritas como: Insere: Top[i]++; if (Top[i] > Base[i+1]) printf("pilha %d cheia",i); else A[Top[i]] = X; Remove: if (Top[i] == Base[i]) printf("pilha %d cheia",i); else { X = A[Top[i]]; Top[i]--; } a) Note que de acordo com o procedimento acima mesmo que ainda exista espaço disponível em A a mensagem de pilha cheia será mostrada. Qual seria uma solução para este problema? b) Suponha que queiramos armazenar 4 pilhas em um array A de tamanho 12 e que todas as pilhas estajam inicialmente distribuidas de forma uniforme em A (igualmente espaçadas) tal que Top[i] = Base[i], i=1,2,3,4. Faça um esquema gráfico para ilustrar como ficarão distribuidas as pilhas (utilizando a solução proposta no ítem (a)) depois da seguinte sequência de inclusões e remoções: I 3 I 3 I 2 I 4 R 2 I 3 I 1 I 3 R 1 R 3, onde I k e R k representam inclusões e remoçõe na pilha k. 13. Uma matriz quadrada é dita triangular inferior (superior) se e somente se todos os elementos acima (abaixo) da diagonal principal são zeros (obs: a diagonal principal pertence ao triângulo de elementos possivelmente não nulos). Dadas A n triangular inferior e C n triangular superior, responda às seguintes questões: (a) Qual o número mínimo de elementos nulos em A n e C n? (b) Qual a relação entre i e j para a ij pertencente ao triângulo nulo de A n? (c) Para n muito grande, é conveniente armazenar apenas os termos distintos de zero num vetor. Supondo C n armazenada por colunas em um vetor B, determine f(i, j) tal que valha a identidade C[i, j] = b f(i,j), para C[i, j] fora do triângulo nulo de C n. (d) Qual a economia de espaço obtida armazenando C no vetor B? 14. Sejam A e B duas matrizes triangulares superiores de ordem n. (a) Qual o número total de elementos não nulos nos triângulo superiores. 3
(b) Determine um esquema para armazenar os triângulos superiores de A e B em uma matriz C[1..n, 1..n + 1]. Sugestão: Coloque o triângulo de A como triângulo superior de C e a tranposta de B como triângulo inferior de C. 15. Uma matriz quadrada é dita tridiagonal se e somente se seus elementos não nulos se situam exclusivamente na região formada pela diagonal principal e as duas diagonais diretamente adjacentes (uma acima e outra abaixo da diagonal principal). Determine um esquema para armazenar os elementos possivelmente não nulos de uma matriz tridiagonal A n num vetor B, respondendo: (a) Qual será a dimensão mínima de B? (b) Como determinar o valor de A[i, j] a partir de B? (c) Qual a relação entre i e j para A[i, j] pertencente à banda de elementos possivelmente não nulos de A n? 16. Uma matriz esparsa A com t elementos não nulos poder ser armazenada em uma matriz E t 3 da seguinte forma: As posicões E[0, 0], E[0, 1] e E[0, 2] armazenam o número de linhas, número de colunas e o número de elementos não nulos da matriz A. Os elementos E[i, 0], E[i, 1] e E[i, 2], i = 1,..., t; armazenam os índices de linha, coluna e o valor dos elementos não nulos respectivamente. (a) Armazene a matriz abaixo utilizando a representação acima. 0 0 7 0 0 11 0 8 0 0 0 0 0 3 0 1 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 (b) Quando a representação acima deixa de ser vantajosa em relação ao gasto de memória? 17. Considere duas matrizes esparsas A e B representadas como no exercício anterior. Escreva algoritmos para: (a) Calcular a matriz S = A + B (b) Calcule a matriz T = A t (transposta de A). (c) Qual a complexidade no pior caso para os algoritmos acima? 18. Construa uma estrutura de dados para representar uma matriz esparsa utilizando listas encadeadas. Utilize dois vetores de ponteiros para gerenciar as cabeças das listas de linhas e colunas. Faça uma análise de complexidade de espaço. 4
19. Considere os elementos 10,22,31,4,15,28,17,88,59. Insira estes elementos em uma tabela hash de comprimento m = 11 utilizando a função hash h (x) = x%m. Resolva as colisões com endereçamento aberto utilizando: (a) hash linear (b) hash quadrático h(x, i) = (h (x) + i + 3i)%m (c) hash duplo com h(x, i) = (h (x) + ih 1 (x))%m, onde h 1 (x) = 1 + (x%(m 1)) 20. Suponha que um elemento x deve ser procurado em uma tabela hash com posições {0, 1,..., m 1}. O esquema de procura é o seguinte: 1) Faça i = h(x), j = 0 2) Verifique se o elemento esta na posiç~ao i. Se estiver ou se a posiç~ao for vazia termine a busca sen~ao 3) Faça j = (j + 1)%m e i = (i + j)%m e volte para 2) Mostre que o esquema acima é um exemplo de hash quadrático. 5