Aula 4 - João Araujo

Propaganda
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
Download