algoritmos e estrutura de dados - listas · listas encadeadas arranjos din^amicos compara˘c~oes...
TRANSCRIPT
![Page 1: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/1.jpg)
Algoritmos e estrutura de dados
Listas
Marco A L Barbosa
cba
Este trabalho esta licenciado com uma Licenca Creative Commons - Atribuicao-CompartilhaIgual 4.0 Internacional.
![Page 2: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/2.jpg)
Conteudo
Listas
Listas encadeadas
Arranjos dinamicos
Comparacoes
Filas
Pilhas
Referencias
![Page 3: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/3.jpg)
Listas
![Page 4: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/4.jpg)
Listas
I Uma Lista e um tipo abstrato de dados usado para armazenaruma sequencia de elementos x0, x1, ..., xn−1
I n e o tamanho da listaI xi esta na posicao i (i-esima posicao)I xi precede xj para todo i < j < nI xi sucede xj para todo n > i > j
I Uma lista pode aumentar ou diminuir de tamanho
I Operacoes comuns em listas
I Buscar um elementoI Consultar um elemento em uma posicaoI Inserir um elemento no inıcio ou no final da listaI Inserir um elemento em uma posicaoI Remover um elementoI Remover um elemento no inıcio ou no final da listaI Remover um elemento de uma posicaoI Etc
4 / 59
![Page 5: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/5.jpg)
Listas encadeadas
![Page 6: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/6.jpg)
Listas encadeadas
I Vamos supor que nao existisse arranjos em Python
I Neste caso, como representar uma lista de elementos?
I Criando um encadeamento de instancias de estruturas
6 / 59
![Page 7: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/7.jpg)
Listas encadeadas
I Vamos supor que nao existisse arranjos em Python
I Neste caso, como representar uma lista de elementos?
I Criando um encadeamento de instancias de estruturas
6 / 59
![Page 8: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/8.jpg)
Listas encadeadas
I Considere a seguinte estrutura
class No(Struct):
’’’
Representa um No em uma lista encadeada,
valor : Qualquer - e o valor armazenado no no
prox : No - e uma referencia para o proximo no
’’’
def __init__(self, valor, prox):
self.init(valor, prox)
I Vamos criar um encadeamento de instancias da classe No
I Chamamos esta estrutura de lista encadeada
7 / 59
![Page 9: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/9.jpg)
Listas encadeadas
>>> xs = No(10, None)
>>> xs
No(10, None)
8 / 59
![Page 10: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/10.jpg)
Listas encadeadas
>>> xs = No(5, xs)
>>> xs
No(5, No(10, None))
9 / 59
![Page 11: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/11.jpg)
Listas encadeadas
>>> xs = No(19, xs)
>>> xs
No(19, No(5, No(10, None)))
10 / 59
![Page 12: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/12.jpg)
Listas encadeadas
I Vamos implementar alguns operacoes de listas usando listasencadeadas
I Para isto, vamos definir um classe ListaEncadeada
class ListaEncadeada(Struct):
’’’
Representa uma lista encadeada.
_primeiro : No - e uma referencia para o
primeiro no da lista
_ultimo : No - e uma referencia para o
ultimo no da lista
’’’
def __init__(self):
self.init()
self._primeiro = None
self._ultimo = None
I O campo ultimo sera util para implementar insercao no final
11 / 59
![Page 13: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/13.jpg)
Listas encadeadas
I Lembre-se que campos com o nome iniciados com saocampos internos. Os campos internos nao sao especificadosna criacao da instancia e nao podem ser acessados pelosclientes da classe. No caso da classe ListaEncadeada istosignifica que o cliente da classe nao pode alterar os camposprimeiro e ultimo diretamente, esses campos sao
alterados atraves dos metodos (a seguir) definidos na classe
12 / 59
![Page 14: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/14.jpg)
Listas encadeadas
I Representacao
13 / 59
![Page 15: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/15.jpg)
Listas encadeadas / Insercao
I Ideia geral da insercao
I Tratamento especial para insercao no inıcio e fim
14 / 59
![Page 16: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/16.jpg)
Listas encadeadas / Insercao no inıcio
I Insercao no inıcio
I Criar um no com o novo elemento na frete do primeiroI Atualizar o primeiro para o novo noI Se o ultimo for igual a None, o ultimo passa referenciar o
primeiroI Analise do tempo de execucao
I A quantidade de operacoes nao depende da quantidade de nosna lista
I Portanto, o tempo de execucao e O(1)
15 / 59
![Page 17: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/17.jpg)
Listas encadeadas / Insercao no inıciodef insere_inicio(lista, v):
’’’
ListaEncadeada, Qualquer -> None
Insere o valor v no inıcio da lista.
Exemplos:
>>> xs = ListaEncadeada()
>>> insere_inicio(xs, 3)
>>> xs._primeiro
No(3, None)
>>> xs._ultimo
No(3, None)
>>> insere_inicio(xs, 1)
>>> xs._primeiro
No(1, No(3, None))
>>> xs._ultimo
No(3, None)
>>> insere_inicio(xs, 27)
>>> xs._primeiro
No(27, No(1, No(3, None)))
>>> xs._ultimo
No(3, None)
’’’ 16 / 59
![Page 18: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/18.jpg)
Listas encadeadas / Insercao no inıcio
def insere_inicio(lista, v):
’’’
...
’’’
lista._primeiro = No(v, lista._primeiro)
if lista._ultimo == None:
lista._ultimo = lista._primeiro
17 / 59
![Page 19: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/19.jpg)
Listas encadeadas / Definicao de metodos
I Vamos transformar esta funcao em um metodo
I Um metodo e uma funcao definida dentro de uma classe
I Vantagens
I Os dados da estrutura e as funcoes que operam nestes dadosficam na mesma unidade sintatica (class)
I E possıvel ter metodos com o mesmo nome em classesdiferentes
I Polimorfismo
18 / 59
![Page 20: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/20.jpg)
Listas encadeadas / Definicao de metodos
I Vamos transformar esta funcao em um metodo
I Um metodo e uma funcao definida dentro de uma classe
I Vantagens
I Os dados da estrutura e as funcoes que operam nestes dadosficam na mesma unidade sintatica (class)
I E possıvel ter metodos com o mesmo nome em classesdiferentes
I Polimorfismo
18 / 59
![Page 21: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/21.jpg)
Listas encadeadas / Definicao de metodos
I Como fazer a mudanca?
I Colocar a funcao dentro da classeI Modificar o nome do primeiro parametro para self (mudar
todas as ocorrencias do nome dentro da funcao)I Alterar as chamadas de funcoes do tipo funcao(x, ...) para
chamadas de metodos x.funcao(...)
I Como escolher entre funcao ou metodo?
I Quando o primeiro argumento for do tipo da classe, definircomo metodo, caso contrario, como uma funcao
I Requer experiencia
Observe com atencao as diferencas nos 2 proximos slides
19 / 59
![Page 22: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/22.jpg)
Listas encadeadas / Definicao de metodos
I Como fazer a mudanca?
I Colocar a funcao dentro da classeI Modificar o nome do primeiro parametro para self (mudar
todas as ocorrencias do nome dentro da funcao)I Alterar as chamadas de funcoes do tipo funcao(x, ...) para
chamadas de metodos x.funcao(...)
I Como escolher entre funcao ou metodo?
I Quando o primeiro argumento for do tipo da classe, definircomo metodo, caso contrario, como uma funcao
I Requer experiencia
Observe com atencao as diferencas nos 2 proximos slides
19 / 59
![Page 23: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/23.jpg)
Listas encadeadas / Definicao de metodosDefinicao de insere inicio como funcao
class ListaEncadeada(Struct):
# descric~ao omitida
def __init__(self):
# corpo omitido
def insere_inicio(lista, v):
’’’
...
>>> xs = ListaEncadeada()
>>> insere_inicio(xs, 3)
>>> xs._primeiro
No(3, None)
>>> xs._ultimo
No(3, None)
# restante dos testes omitidos
’’’
lista._primeiro = No(v, lista._primeiro)
if lista._ultimo == None:
lista._ultimo = lista._primeiro
20 / 59
![Page 24: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/24.jpg)
Listas encadeadas / Definicao de metodosDefinicao de insere inicio como metodo
class ListaEncadeada(Struct):
# descric~ao omitida
def __init__(self):
# corpo omitido
def insere_inicio(self, v):
’’’
...
>>> xs = ListaEncadeada()
>>> xs.insere_inicio(3)
>>> xs._primeiro
No(3, None)
>>> xs._ultimo
No(3, None)
# restante dos testes omitidos
’’’
self._primeiro = No(v, self._primeiro)
if self._ultimo == None:
self._ultimo = self._primeiro
21 / 59
![Page 25: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/25.jpg)
Listas encadeadas / Definicao de metodos
De agora em diante vamos definir funcoes como metodos quandoisto for adequado
22 / 59
![Page 26: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/26.jpg)
Listas encadeadas / Insercao no fim
I Insercao no fim
I Criar um no com o novo elementoI Se a lista esta vazia, atualizar o primeiro e ultimo para o novo
noI Caso contrario colocar o novo no apos o ultimo e atualizar o
ultimoI Analise do tempo de execucao
I A quantidade de operacoes nao depende da quantidade de nosna lista
I Portanto, o tempo de execucao e O(1)
23 / 59
![Page 27: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/27.jpg)
Listas encadeadas / Insercao no fimdef insere_fim(self, v):
’’’
ListaEncadeada, Qualquer -> None
Inser v no final da lista
Exemplos:
>>> xs = ListaEncadeada()
>>> xs.insere_fim(3)
>>> xs._primeiro
No(3, None)
>>> xs._ultimo
No(3, None)
>>> xs.insere_fim(10)
>>> xs._primeiro
No(3, No(10, None))
>>> xs._ultimo
No(10, None)
>>> xs.insere_fim(20)
>>> xs._primeiro
No(3, No(10, No(20, None)))
>>> xs._ultimo
No(20, None)
’’’ 24 / 59
![Page 28: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/28.jpg)
Listas encadeadas / Insercao no fim
def insere_fim(self, v):
’’’
...
’’’
p = No(v, None)
if self._primeiro == None:
self._primeiro = p
self._ultimo = p
else:
self._ultimo.prox = p
self._ultimo = p
25 / 59
![Page 29: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/29.jpg)
Listas encadeadas / Remocao
I Ideia geral da remocao
I Tratamento especial para remocao no inıcio e fim
26 / 59
![Page 30: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/30.jpg)
Listas encadeadas / Remocao no inıcio
I Remocao no inıcio
I Alterar o primeiro para referenciar o proximo do primeiroI Se o novo primeiro e None, isto e, a lista ficou vazia, atualizar
o ultimo para NoneI Analise do tempo de execucao
I A quantidade de operacoes nao depende da quantidade de nosna lista
I Portanto, o tempo de execucao e O(1)
27 / 59
![Page 31: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/31.jpg)
Listas encadeadas / Remocao no inıcio# Veja os testes completos no arquivo listas.py
def remove_inicio(self):
’’’
ListaEncadeada -> Qualquer
Remove o primeiro elemento da lista e devolve o valor removido.
Lanca uma excec~ao se a lista estiver vazia.
>>> xs = ListaEncadeada()
>>> xs.insere_inicio(3)
>>> xs.insere_inicio(5)
>>> xs.remove_inicio()
5
>>> xs._primeiro
No(3, None)
>>> xs._ultimo
No(3, None)
>>> xs.remove_inicio()
3
>>> xs._primeiro == None
True
>>> xs._ultimo == None
True
’’’ 28 / 59
![Page 32: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/32.jpg)
Listas encadeadas / Remocao no inıcio
# Veja os testes completos no arquivo listas.py
def remove_inicio(self):
’’’
...
’’’
if self._primeiro == None:
raise Exception(’lista vazia’)
v = self._primeiro.valor
self._primeiro = self._primeiro.prox
if self._primeiro == None:
self._ultimo = None
return v
29 / 59
![Page 33: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/33.jpg)
Listas encadeadas / Remocao no fim
I Remocao no fim
I Se a lista tem apenas um no, remover do inıcioI Senao procurar o penultimo no e remover o proximo (que e o
ultimo)I Atualizar o ultimoI Analise do tempo de execucao
I Para encontrar o penultimo e necessario visitar n − 1 nosI Portanto, o tempo de execucao e O(n)
30 / 59
![Page 34: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/34.jpg)
Listas encadeadas / Remocao no fim
# Veja os testes no arquivo listas.py
def remove_fim(self):
’’’
ListaEncadeada -> None
Remove o ultimo elemento da lista e devolve o valor removido.
Lanca uma excec~ao se a lista estiver vazia.
’’’
if self._primeiro == None:
raise Exception(’lista vazia’)
if self._primeiro == self._ultimo:
return self.remove_inicio()
# procura o penultimo no
p = self._primeiro
while p.prox != self._ultimo:
p = p.prox
return self._remove_prox(p)
31 / 59
![Page 35: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/35.jpg)
Listas encadeadas / Remocao no fim
def _remove_prox(self, p):
’’’
ListaEncadeada, No -> Qualquer
Remove o proximo a partir de p e devolve o valor armazenado no no removido.
’’’
v = p.prox.valor
p.prox = p.prox.prox
if p.prox == None:
self._ultimo = p
return v
32 / 59
![Page 36: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/36.jpg)
Listas encadeadas / Consulta e alteracao por posicao
I Consulta e alteracao por posicao
I Iniciar uma referencia p para o primeiro elementoI Avancar p para o proximo ate que chegue na posicao
especificada ou a lista acabeI Se chegou na posicao especificada, devolver ou alterar o valor
do no, caso contrario gerar um erro pois a posicao esta fora dalista
I Analise do tempo de execucao
I No pior caso p avancara ate acabar a lista, ou seja, vai passarpor todos os nos
I Portanto, o tempo de execucao e O(n)
33 / 59
![Page 37: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/37.jpg)
Listas encadeadas / Consulta e alteracao por posicaoI Exemplo inicial
>>> xs = ListaEncadeada()
>>> xs.insere_fim(4); xs.insere_fim(2); xs.insere_fim(7)
>>> xs.consulta(1)
2
>>> xs.consulta(2)
7
>>> xs.altera(1, 10)
>>> xs._primeiro
No(4, No(10, No(7, None)))
I Compare com o funcionamento da lista (pre-definida) doPython>>> xs = [4, 2, 7]
>>> xs[1]
2
>>> xs[2]
7
>>> xs[1] = 10
>>> xs
[4, 10, 7]34 / 59
![Page 38: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/38.jpg)
Listas encadeadas / Consulta e alteracao por posicao
I O que e mais conveniente
I xs[1] ou xs.consulta(1)?I xs[1] = 10 ou xs.altera(1, 10)?
I A forma usada nas listas pre-definidas e mais conveniente
I Como fazer para tornar a consulta e alteracao por posicao emlistas encadeada tao conveniente quanto das listaspre-definidas?
I Alterar o nome do metodo consulta para getitemI Alterar o nome do metodo altera para setitemI Estas alteracoes permite escrever xs[1] ao inves de
xs.consulta(1) e xs[1] = 10 ao inves de xs.altera(1,
10)
35 / 59
![Page 39: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/39.jpg)
Listas encadeadas / Consulta e alteracao por posicaoI Antes
>>> xs = ListaEncadeada()
>>> xs.insere_fim(4); xs.insere_fim(2); xs.insere_fim(7)
>>> xs.consulta(1)
2
>>> xs.consulta(2)
7
>>> xs.altera(1, 10)
>>> xs._primeiro
No(4, No(10, No(7, None)))
I Depois>>> xs = ListaEncadeada()
>>> xs.insere_fim(4); xs.insere_fim(2); xs.insere_fim(7)
>>> xs[1] # equivalente a x.__getitem__(1)
2
>>> xs[2]
7
>>> xs[1] = 10 # equivalente a x.__setitem__(1, 10)
>>> xs._primeiro
No(4, No(10, No(7, None)))
36 / 59
![Page 40: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/40.jpg)
Listas encadeadas / Consulta e alteracao posicao
# Veja o codigo completo no arquivo listas.py
def _consulta_pos(self, pos):
’’’
ListaEncadeada, Natural -> Qualquer
Devolve o No na posic~ao pos.
Lanca uma excec~ao se pos >= len(lista) ou pos < 0.
’’’
p = self._primeiro
i = pos
while p != None and i > 0:
p = p.prox
i = i - 1
if p != None and i == 0:
return p
else:
raise Exception(’ındice fora do intervalo’)
37 / 59
![Page 41: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/41.jpg)
Listas encadeadas / Consulta e alteracao posicao
# Veja o codigo completo no arquivo listas.py
def __getitem__(self, pos):
p = self._consulta_pos(pos)
return p.valor
def __setitem__(self, pos, v):
p = self._consulta_pos(pos)
p.valor = v
38 / 59
![Page 42: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/42.jpg)
Listas encadeadas / Insercao em uma posicao
I Insere em uma posicao
I Se a posicao for 0, inserir no inıcioI Senao, procurar o no na posicao anterior e insirir o novo valor
apos este noI Analise do tempo de execucao
I Inserir no inıcio e constanteI No no pior caso, todos os nos serao visitados se o ındice
estiver fora da faixaI Portanto, o tempo de execucao e O(n)
39 / 59
![Page 43: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/43.jpg)
Listas encadeadas / Insercao em uma posicao
# Veja os exemplos no arquivo listas.py
def insere(self, pos, v):
’’’
ListaEncadeada, Natural, Qualquer -> None
Insere v na posic~ao pos.
’’’
if pos == 0:
self.insere_inicio(v)
else:
# procura o no na posic~ao anterior a inserc~ao
p = self._consulta_pos(pos - 1)
# insere apos o no encontrado
self._insere_prox(p, v)
40 / 59
![Page 44: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/44.jpg)
Listas encadeadas / Insercao em uma posicao
# Veja os exemplos no arquivo listas.py
def _insere_prox(self, p, v):
’’’
ListaEncadeada, No, Qualquer -> None
Insere o v apos o no p.
Exemplos: veja o metodo insere
’’’
p.prox = No(v, p.prox)
if p.prox.prox == None:
self._ultimo = p.prox
41 / 59
![Page 45: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/45.jpg)
Listas encadeadas / Remocao em uma posicao
I Remocao em uma posicao
I Se a posicao for 0, remover do inıcioI Senao, procurar o no na posicao anterior e remover o proximo
noI Analise do tempo de execucao
I Remover no inıcio e constanteI No pior caso, todos os nos serao visitados se o ındice estiver
fora da faixaI Portanto, o tempo de execucao e O(n)
42 / 59
![Page 46: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/46.jpg)
Listas encadeadas / Remocao em uma posicao
def remove_pos(self, pos):
’’’
ListaEncadeada, Natural -> Qualquer
>>> xs = ListaEncadeada()
>>> xs.insere_fim(5)
>>> xs.insere_fim(2)
>>> xs.insere_fim(4)
>>> xs.insere_fim(8)
>>> xs.remove_pos(2)
4
>>> xs.remove_pos(0)
5
>>> xs.remove_pos(1)
8
’’’
if pos == 0:
return self.remove_inicio()
p = self._consulta_pos(pos - 1)
return self._remove_prox(p)
43 / 59
![Page 47: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/47.jpg)
Listas encadeadas
I Veja no arquivo listas.py a definicao de outras operacoes
I Verificar se um elemento esta na listaI Remover um elementoI Contar a quantidade de nosI Criar uma representacao textual
44 / 59
![Page 48: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/48.jpg)
Listas encadeadas
I Melhorias
I Manter tambem uma referencia para o no anterior
I Permite remover qualquer no em O(1) (mais o tempo paraencontrar o no)
I Este tipo de lista e chamada de lista duplamente encadeada
I Criar um no especial chamada sentinela que nao faz parte dalista mas e o primeiro e ultimo no encadeamento
I Permite de as operacoes de insercao e remocao sejam escritasde forma generica, sem distinguir se a operacao e no inıcio oufim da lista
45 / 59
![Page 49: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/49.jpg)
Arranjos dinamicos
![Page 50: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/50.jpg)
Arranjos dinamicos
I Os arranjos nas linguagens C e Pascal sao estaticos. Eles naopodem mudar de tamanho
I Os arranjos em Python sao dinamicos, eles podem mudar detamanho
I Um arranjo dinamico pode suportar as mesmas operacoes deuma lista, em outras palavras, um arranjo dinamico podeimplementar o tipo abstrato Lista
I Como implementar um arranjo dinamico em termos de umarranjo estatico?
47 / 59
![Page 51: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/51.jpg)
Arranjos dinamicos / Insercao
I Quando um elemento e inserido em uma posicao i , todos oselementos xi+1, onde i + 1 < n, devem ser “empurrados” paraa direita
I Se nao houver espaco, um novo arranjo com tamanho maiordeve ser criado
I Os valores do arranjo antigo sao copiados para o novo arranjoI O arranjo antigo e descartado
48 / 59
![Page 52: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/52.jpg)
Arranjos dinamicos / Remocao
I Quando um elemento e removido de uma posicao i , todos oselementos xi+1, onde i + 1 < n, devem ser “empurrados” paraa esquerda
49 / 59
![Page 53: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/53.jpg)
Comparacoes
![Page 54: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/54.jpg)
Comparacoes
Lista EncadeadaArranjo
dinamico
Consultaposicao
O(n) O(1)
Inserir no inıcio O(1) O(n)
Inserir no fim O(1) O(1)
Remover doinıcio
O(1) O(n)
Remover do fim O(n) O(1)
Inserir proximo Tempo de busca+ O(1)
O(n)
51 / 59
![Page 55: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/55.jpg)
Filas
![Page 56: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/56.jpg)
Filas
I Uma fila e como uma lista, mas as insercoes e remocoes deveseguir uma polıtica
I FIFO - First in, First outI O primeiro a entrar e o primeiro a sairI A operacao de insercao tambem e conhecida como enfileiraI A operacao de remocao tambem e conhecida como desenfileira
53 / 59
![Page 57: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/57.jpg)
Filas
I Se existisse uma classe Fila, como gostarıamos que elafuncionasse?
>>> f = Fila()
>>> f.insere(3)
>>> f.insere(5)
>>> f.insere(8)
>>> f.remove()
3
>>> f.insere(10)
>>> f.insere(20)
>>> f.remove()
5
>>> f.remove()
8
>>> f.remove()
10
>>> f.remove()
20
I Veja o arquivo listas.py
54 / 59
![Page 58: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/58.jpg)
Pilhas
![Page 59: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/59.jpg)
Pilhas
I Uma pilha e como uma lista, mas as insercoes e remocoesdeve seguir uma polıtica
I LIFO - Last in, First outI O ultimo a entrar e o primeiro a sairI A operacao de insercao tambem e conhecida como empilhaI A operacao de remocao tambem e conhecida como desempilha
56 / 59
![Page 60: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/60.jpg)
Pilhas
I Se existisse uma classe Pilha, como gostarıamos que elafuncionasse?
>>> p = Pilha()
>>> p.insere(3)
>>> p.insere(5)
>>> p.insere(8)
>>> p.remove()
8
>>> p.insere(10)
>>> p.insere(20)
>>> p.remove()
20
>>> p.remove()
10
>>> p.remove()
5
>>> p.remove()
3
I Veja o arquivo listas.py
57 / 59
![Page 61: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/61.jpg)
Referencias
![Page 62: Algoritmos e estrutura de dados - Listas · Listas encadeadas Arranjos din^amicos Compara˘c~oes Filas Pilhas Refer^encias. Listas. Listas I Uma Lista e um tipo abstrato de dados](https://reader034.vdocuments.net/reader034/viewer/2022042920/5f67c1b4c68cb945f8049b8a/html5/thumbnails/62.jpg)
Referencias
I Projeto de algoritmos / Listas encadeadas. Paulo Feofiloff.
I Algoritmos: Teoria e pratica. 3a edicao. Cormen, Thomas Hat all. Capıtulo 10.
I Algoritmos: Teoria e pratica. 2a edicao. Cormen, Thomas Hat all. Capıtulo 10.
59 / 59