Estruturas de Informação I - Aula 4 Listas João Araujo Ribeiro [email protected] Universidade do Estado do Rio de Janeiro Departamento de Engenharia de Sistemas e Computação João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 1 / 24 Resumo 1 EI03 - Listas Sequenciais 2 EI03 - Arrays dinâmicos 3 EI03 - Listas Encadeadas João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 2 / 24 EI03 - Listas Sequenciais Listas Sequenciais Em uma lista sequencial, o sucessor de um elemento ocupa a posição física subsequente deste elemento. Uma das formas mais comuns de se implementar uma lista sequencial é utilizando ARRAY. 1 1 Baseado no curso: http://www.lcad.icmc.usp.br/nonato/ED/ João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 3 / 24 EI03 - Listas Sequenciais Armazenamento Em um array associamos a cada elemento um índice (denominamos elemento ai ). Desta forma, estamos armazenando o elemento ai e ai+1 nas consecutivas posições i e i+1 do array. Figura : Armazenamento de Lista Sequencial João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 4 / 24 EI03 - Listas Sequenciais Vantagens em se usar array 1 Rápido acesso aos elementos 2 Facilidade em modicar informações Os elementos do array podem ser acessados em tempo constante, por exemplo, na maioria das linguagens, o elemento que está na posição i de um array a pode ser recuperado utilizando-se a[i] João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 5 / 24 EI03 - Listas Sequenciais Desvantagens 1 2 Denição prévia do tamanho do array Diculdade para inserir (e remover) um elemento entre dois outros já existentes Na denição de um array precisamos especicar o número máximo de elementos que serão armazenados. João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 6 / 24 EI03 - Listas Sequenciais Inserção Suponha que queiramos inserir um novo elemento x em uma posição i já ocupada de um vetor a. Para realizar esta tarefa teremos que deslocar os elementos para as posições respectivamente. Note que no pior caso (inserir na primeira posição) esta operação leva tempo O(n). Figura : Inserção de elemento João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 7 / 24 EI03 - Listas Sequenciais Array referencial Podemos contornar as limitações do array sequencial usando referências. Imagine que um hospital controle os leitos de acordo com o nome do paciente que o ocupa. Assim, se um hospital possui 200 leitos é razoável que eles sejam numerados entre 0 e 199. Como armazenar os nomes dos pacientes ocupando os leitos, se os nomes têm tamanho variável? João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 8 / 24 1 EI03 - Listas Sequenciais Array referencial Cada célula do array possui um tamanho xo, mas aponta para uma string de tamanho variável. [ Rene , Joseph , Janet , Jonas , Helen , Virginia , ... ] Figura : Array sequencial com ponteiros João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 9 / 24 EI03 - Listas Sequenciais Um objeto, várias listas Em Python, um mesmo objeto pode participar de várias listas. Figura : Listas João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 10 / 24 EI03 - Listas Sequenciais Listas e tuplas Estude em Python a diferença entre listas e tuplas. Listas são mutáveis enquanto tuplas são imutáveis. Por exemplo, tuplas listas 1 2 3 4 5 6 7 primes=(2,3,5,7,11,13,17,19) temp=primes[3:6] print "Primes = ", primes print "Temp= " , temp temp[2]=15 print "Primes = ", primes print "Temp= " , temp 1 2 3 4 5 6 7 primes=[2,3,5,7,11,13,17,19] temp=primes[3:6] print "Primes = ", primes print "Temp= " , temp temp[2]=15 print "Primes = ", primes print "Temp= " , temp O primeiro gera erro e o segundo não. Por que? João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 11 / 24 EI03 - Listas Sequenciais Atribuição à lista em python Figura : temp[2]=15 João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 12 / 24 EI03 - Listas Sequenciais Atribuição de um elemento Todas as células da lista referenciam o mesmo objeto. Figura : counters=[0]*8 João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 13 / 24 EI03 - Listas Sequenciais Modicação de um elemento Figura : counters[2] += 1 João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 14 / 24 EI03 - Listas Sequenciais estender uma lista Figura : primes.extend(extras) João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 15 / 24 EI03 - Listas Sequenciais Para estudar Python Para estudar listas e tuplas em Python: http://www3.ifrn.edu.br/jurandy/fdp/doc/aprendapython/capitulo_08.html e http://www3.ifrn.edu.br/jurandy/fdp/doc/aprendapython/capitulo_09.html João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 16 / 24 EI03 - Arrays dinâmicos Arrays dinâmicos Um array que cresce além dos seus limites iniciais é chamado de array dinâmico. Emboa a lista em python tenha seu tamanho especicado na criação, ela pode crescer de acordo com a demanda do usuário. Inicialmente python reserva um pouco mais de espaço que a alocação primordial. Quando o usuário acrescenta elementos, python usa este espaço extra. Se o espaço extra termina, é criada uma lova lista com espaço suciente e a antiga lista é abandonada. João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 17 / 24 EI03 - Arrays dinâmicos Programa O programa a seguir mostra como funciona o array dinâmico em python 1 2 3 4 5 6 7 import sys # data = [] for k in range(27): # a = len(data) # b = sys.getsizeof(data) # print( Tamanho: {0:3d}; Tamanho em data.append(None) João Araujo Ribeiro (UERJ) fornece a funcao getsizeof NOTA: n deve ser escolhido numero de elementos tamanho real em bytes bytes: {1:4d} .format(a, b)) Estruturas de Informação I EstrInf 18 / 24 EI03 - Arrays dinâmicos Como implementar um array dinâmico Se tivermos um array A e tentarmos acrescentar um elemento quando A já está cheio, seguimos o seguinte algoritmo: 1 2 Alocamos um novo array B com capacidade maior que A. Fazemos B[i] = A[i], para i = 0, . . . , n - 1, onde n indica o número atual de itens. 3 Fazemos A = B. 4 Inserimos o novo elemento no novo array. João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 19 / 24 EI03 - Arrays dinâmicos Como implementar um array dinâmico Figura : Crescendo um array) João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 20 / 24 EI03 - Arrays dinâmicos Exercício Modique o programa seguinte para testar se Python reduz o tamanho de uma lista quando elementos são retirados dela (pop faz o contrário de append). 1 2 3 4 5 6 7 import sys # data = [] for k in range(27): # a = len(data) # b = sys.getsizeof(data) # print( Tamanho: {0:3d}; Tamanho em data.append(None) João Araujo Ribeiro (UERJ) fornece a funcao getsizeof NOTA: n deve ser escolhido numero de elementos tamanho real em bytes bytes: {1:4d} .format(a, b)) Estruturas de Informação I EstrInf 21 / 24 EI03 - Listas Encadeadas Listas Encadeadas Em listas encadeadas, elementos consecutivos na lista não implicam em elementos consecutivos na representação (a ordem é lógica). Na implementação é necessário armazenar separadamente a informação de um elemento da lista, normalmente o primeiro. Existem duas formas de se representar listas encadeadas, através de array, denominadas listas estáticas, ou por ponteiros chamadas listas dinâmicas. João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 22 / 24 Figura : Listas Encadeadas João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 23 / 24 FIM João Araujo Ribeiro (UERJ) Estruturas de Informação I EstrInf 24 / 24