Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Listas Lineares
Huei Diana LeeAna Paula Martins
Fabiana Frata Furlan Peres
Algoritmos e Estruturas de Dados
2007
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Conteúdo
Introdução
TAD Lista Linear
Implementação
Tipos de RepresentaçãoAlocação SeqüencialAlocação Encadeada
Referências
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Definição de Lista Linear
Uma Lista Linear é definida como umacoleção de dados de um mesmo tipo.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Uma Lista Linear pode ser...
I Seqüência de zero ou mais ítens x1, x2,..,xn,na qual xi é de um determinado tipo e nrepresenta o tamanho da lista linear;
I Sua principal propriedade estrutural envolveas posições relativas dos ítens em umadimensão:
I Assumindo n ≥ 1, x1 é o primeiro item da lista e xn é oúltimo item da lista;
I xi precede xi+1 para i = 1, 2.., n − 1;I xi sucede xi−1 para i = 2, 3, .., n;I o elemento xi é dito estar na i-ésima posição da lista.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Principais Operações
I Inserção;
I Eliminação;
I Busca (acesso).
As restrições sobre as operações determinamdiferentes tipos de listas:
I Pilhas;
I Filas;
I Filas Duplas entre outras.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Principais Operações
I Inserção;
I Eliminação;
I Busca (acesso).
As restrições sobre as operações determinamdiferentes tipos de listas:
I Pilhas;
I Filas;
I Filas Duplas entre outras.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Algumas aplicações...
I Manipulação simbólica;
I Gerência de memória;
I Simulação;
I Compiladores.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
TAD Lista Linear I
O conjunto de operações a ser definido depende de cadaaplicação.
Um conjunto de operações necessário a uma maioria deaplicações é:
1. Criar uma lista linear vazia;2. Inserir um novo item imediatamente após o i-ésimo
item;3. Retirar o i-ésimo item;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
TAD Lista Linear II4. Localizar o i-ésimo item para examinar e/ou alterar o
conteúdo de seus componentes;5. Combinar duas ou mais listas lineares em uma lista
única;6. Partir uma lista linear em duas ou mais listas;7. Fazer uma cópia da lista linear;8. Ordenar os ítens da lista em ordem ascendente ou
descendente, de acordo com alguns de seuscomponentes;
9. Pesquisar a ocorrência de um item com um valorparticular em algum componente.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Implementação I
I Várias estruturas de dados podem serusadas para representar listas lineares,cada uma com vantagens e desvantagensparticulares;
I As duas representações mais utilizadas sãoas implementações por meio de alocaçãoseqüencial (matrizes/arranjos) e dealocação encadeada (apontadores).
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Implementação IIExemplo de Conjunto de Operações:
1. FLVazia(Lista). Faz a lista ficar vazia;2. Insere(x, Lista). Insere x após o último item da lista;3. Retira(p, Lista, x). Retorna o item x que está na
posição p da lista, retirando-o da lista e deslocandoos itens a partir da posição p+1 para as posiçõesanteriores;
4. Vazia(Lista). Esta função retorna true se lista vazia;senão retorna false;
5. Imprime(Lista). Imprime os itens da lista na ordem deocorrência.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Alocação SeqüencialI Os itens da lista são armazenados em posições
contíguas de memória;
I A lista pode ser percorrida em qualquer direção;
I A inserção de um novo item pode ser realizada apóso último item com custo constante;
I A inserção de um novo item no meio da lista requerum deslocamento de todos os itens localizados apóso ponto de inserção;
I Retirar um item do início da lista requer umdeslocamento de itens para preencher o espaçodeixado vazio.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Alocação Seqüencial
...
xn
...
x2
x1
ItensPrimeiro = 1
2
Último−1
MaxTam
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Alocação Seqüencial
I Os ítens são armazenados em um array de tamanhosuficiente para armazenar a lista;
I O campo Último aponta para a posição seguinte a doúltimo elemento da lista;
I O i-ésimo item da lista está armazenado na i-ésimaposição do array, 1 ≤ i < Último;
I A constante MaxTam define o tamanho máximopermitido para a lista.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Operações 1
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 6
Estrutura da Lista Usando Arranjo
• Os itens são armazenados em um array detamanho suficiente para armazenar a lista.
• O campo Último aponta para a posiçãoseguinte a do último elemento da lista.
• O i-ésimo item da lista está armazenado nai-ésima posição do array, 1 ≤ i <Último.
• A constante MaxTam define o tamanhomáximo permitido para a lista.
const
InicioArranjo = 1;
MaxTam = 1000;
type
TipoChave = integer ;
Apontador = integer ;
TipoItem = record
Chave: TipoChave;
{ outros componentes }
end;
TipoLista = record
Item : array [ 1 . .MaxTam] of TipoItem;
Primeiro : Apontador;
Ultimo : Apontador
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Operações 2Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 7
Operações sobre Lista Usando Arranjo
procedure FLVazia (var Lista : TipoLista ) ;
begin
Lista .Primeiro := InicioArranjo ;
Lista .Ultimo := Lista .Primeiro ;
end;
function Vazia (var Lista : TipoLista ) : boolean;
begin
Vazia := Lista .Primeiro = Lista .Ultimo;
end;
procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;
begin
i f Lista .Ultimo > MaxTam
then writeln ( ’ Lista esta cheia ’ )
else begin
Lista . Item[ Lista .Ultimo ] := x;
Lista .Ultimo := Lista .Ultimo + 1;
end;
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Operações 3
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 7
Operações sobre Lista Usando Arranjo
procedure FLVazia (var Lista : TipoLista ) ;
begin
Lista .Primeiro := InicioArranjo ;
Lista .Ultimo := Lista .Primeiro ;
end;
function Vazia (var Lista : TipoLista ) : boolean;
begin
Vazia := Lista .Primeiro = Lista .Ultimo;
end;
procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;
begin
i f Lista .Ultimo > MaxTam
then writeln ( ’ Lista esta cheia ’ )
else begin
Lista . Item[ Lista .Ultimo ] := x;
Lista .Ultimo := Lista .Ultimo + 1;
end;
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Operações 4
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 7
Operações sobre Lista Usando Arranjo
procedure FLVazia (var Lista : TipoLista ) ;
begin
Lista .Primeiro := InicioArranjo ;
Lista .Ultimo := Lista .Primeiro ;
end;
function Vazia (var Lista : TipoLista ) : boolean;
begin
Vazia := Lista .Primeiro = Lista .Ultimo;
end;
procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;
begin
i f Lista .Ultimo > MaxTam
then writeln ( ’ Lista esta cheia ’ )
else begin
Lista . Item[ Lista .Ultimo ] := x;
Lista .Ultimo := Lista .Ultimo + 1;
end;
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quiz...E para inserir um elemento na posição i , onde i ≤Último?
if Último < MaxTam...then begin..........for j := Último + 1 downto i + 1 do..............A[j] := A[j -1];..............A[i] := novovalor;..............Último := Último + 1;........end;...else impossível; Lista cheia
Qual o no de movimentos? Último + 1 - (i)
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quiz...E para inserir um elemento na posição i , onde i ≤Último?
if Último < MaxTam...then begin..........for j := Último + 1 downto i + 1 do..............A[j] := A[j -1];..............A[i] := novovalor;..............Último := Último + 1;........end;...else impossível; Lista cheia
Qual o no de movimentos? Último + 1 - (i)
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quiz...E para inserir um elemento na posição i , onde i ≤Último?
if Último < MaxTam...then begin..........for j := Último + 1 downto i + 1 do..............A[j] := A[j -1];..............A[i] := novovalor;..............Último := Último + 1;........end;...else impossível; Lista cheia
Qual o no de movimentos?
Último + 1 - (i)
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quiz...E para inserir um elemento na posição i , onde i ≤Último?
if Último < MaxTam...then begin..........for j := Último + 1 downto i + 1 do..............A[j] := A[j -1];..............A[i] := novovalor;..............Último := Último + 1;........end;...else impossível; Lista cheia
Qual o no de movimentos? Último + 1 - (i)
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Operações 5
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 8
Operações sobre Lista Usando Arranjo
procedure Retira (p:Apontador ; var Lista : TipoLista ;
var Item:TipoItem) ;
var Aux: integer ;
begin
i f Vazia ( Lista ) or (p >= Lista .Ultimo)
then writeln ( ’Erro : Posicao nao existe ’ )
else begin
Item := Lista . Item[p] ;
Lista .Ultimo := Lista .Ultimo − 1;
for Aux := p to Lista .Ultimo − 1 do
Lista . Item[Aux] := Lista . Item[Aux+1];
end;
end;
procedure Imprime (var Lista : TipoLista ) ;
var Aux: integer ;
begin
for Aux := Lista .Primeiro to Lista .Ultimo − 1 do
writeln ( Lista . Item[Aux] .Chave) ;
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quiz...
Qual o no de movimentos?
Último - p
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quiz...
Qual o no de movimentos? Último - p
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Operações 6
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 8
Operações sobre Lista Usando Arranjo
procedure Retira (p:Apontador ; var Lista : TipoLista ;
var Item:TipoItem) ;
var Aux: integer ;
begin
i f Vazia ( Lista ) or (p >= Lista .Ultimo)
then writeln ( ’Erro : Posicao nao existe ’ )
else begin
Item := Lista . Item[p] ;
Lista .Ultimo := Lista .Ultimo − 1;
for Aux := p to Lista .Ultimo − 1 do
Lista . Item[Aux] := Lista . Item[Aux+1];
end;
end;
procedure Imprime (var Lista : TipoLista ) ;
var Aux: integer ;
begin
for Aux := Lista .Primeiro to Lista .Ultimo − 1 do
writeln ( Lista . Item[Aux] .Chave) ;
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Vantagens:
I acesso direto: qualquer elemento do arraypode ser acessado diretamente através deseu índice;
I tempo constante: o tempo de acesso dequalquer elemento do array, seja o primeiroou o último, é igual.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Desvantagens:I custo para inserir ou retirar itens da lista, que pode
causar um deslocamento de todos os itens, no piorcaso;
I em aplicações em que não existe previsão sobre ocrescimento da lista, a utilização de arranjos emlinguagens como o Pascal pode ser problemáticaporque neste caso o tamanho máximo da lista tem deser definido em tempo de compilação.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Desvantagens:I custo para inserir ou retirar itens da lista, que pode
causar um deslocamento de todos os itens, no piorcaso;
I em aplicações em que não existe previsão sobre ocrescimento da lista, a utilização de arranjos emlinguagens como o Pascal pode ser problemáticaporque neste caso o tamanho máximo da lista tem deser definido em tempo de compilação.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quando usar representação seqüencial?
I Em listas pequenas;
I Quando o comportamento das listas éconhecido;
I Pouca ocorrência de inserções / eliminaçõesno meio da lista, onde os deslocamentostornam o processo ineficiente.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quando usar representação seqüencial?
I Em listas pequenas;
I Quando o comportamento das listas éconhecido;
I Pouca ocorrência de inserções / eliminaçõesno meio da lista, onde os deslocamentostornam o processo ineficiente.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quando usar representação seqüencial?
I Em listas pequenas;
I Quando o comportamento das listas éconhecido;
I Pouca ocorrência de inserções / eliminaçõesno meio da lista, onde os deslocamentostornam o processo ineficiente.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Seqüencial
Quando usar representação seqüencial?
I Em listas pequenas;
I Quando o comportamento das listas éconhecido;
I Pouca ocorrência de inserções / eliminaçõesno meio da lista, onde os deslocamentostornam o processo ineficiente.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Alocação Encadeada
I Cada item é encadeado com o seguintemediante uma variável do tipo Apontador;
I Permite utilizar posições não contíguas dememória;
I É possível inserir e retirar elementos semnecessidade de deslocar os itens seguintesda lista;
I Há uma célula cabeça para simplificar asoperações sobre a lista.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Alocação Encadeada
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 10
Implementação de Listas por meio deApontadores
• Cada item é encadeado com o seguintemediante uma variável do tipo Apontador.
• Permite utilizar posições não contíguas dememória.
• É possível inserir e retirar elementos semnecessidade de deslocar os itens seguintesda lista.
• Há uma célula cabeça para simplificar asoperações sobre a lista.
...Lista nilxnx1
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Estrutura da lista
I A lista é constituída de células;
I Cada célula contém um item da lista e umapontador para a célula seguinte;
I O registro TipoLista contém um apontadorpara a célula cabeça e um apontador para aúltima célula da lista.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Operações 1
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 11
Estrutura da Lista UsandoApontadores
• A lista é constituída de células.
• Cada célula contém um item da lista e umapontador para a célula seguinte.
• O registro TipoLista contém um apontadorpara a célula cabeça e um apontador para aúltima célula da lista.
type
Apontador = ^Celula ;
TipoItem = record
Chave: TipoChave;
{ outros componentes }
end;
Celula = record
Item : TipoItem;
Prox : Apontador;
end;
TipoLista = record
Primeiro : Apontador;
Ultimo : Apontador;
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Operações 2
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 12
Operações sobre Lista UsandoApontadores
procedure FLVazia (var Lista : TipoLista ) ;
begin
new ( Lista .Primeiro ) ;
Lista .Ultimo := Lista .Primeiro ;
Lista .Primeiro^.Prox := n i l ;
end;
function Vazia ( Lista : TipoLista ) : boolean;
begin
Vazia := Lista .Primeiro = Lista .Ultimo;
end;
procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;
begin
new( Lista .Ultimo^.Prox) ;
Lista .Ultimo := Lista .Ultimo^.Prox;
Lista .Ultimo^.Item := x;
Lista .Ultimo^.Prox := n i l
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Operações 3
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 12
Operações sobre Lista UsandoApontadores
procedure FLVazia (var Lista : TipoLista ) ;
begin
new ( Lista .Primeiro ) ;
Lista .Ultimo := Lista .Primeiro ;
Lista .Primeiro^.Prox := n i l ;
end;
function Vazia ( Lista : TipoLista ) : boolean;
begin
Vazia := Lista .Primeiro = Lista .Ultimo;
end;
procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;
begin
new( Lista .Ultimo^.Prox) ;
Lista .Ultimo := Lista .Ultimo^.Prox;
Lista .Ultimo^.Item := x;
Lista .Ultimo^.Prox := n i l
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Operações 4
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 12
Operações sobre Lista UsandoApontadores
procedure FLVazia (var Lista : TipoLista ) ;
begin
new ( Lista .Primeiro ) ;
Lista .Ultimo := Lista .Primeiro ;
Lista .Primeiro^.Prox := n i l ;
end;
function Vazia ( Lista : TipoLista ) : boolean;
begin
Vazia := Lista .Primeiro = Lista .Ultimo;
end;
procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;
begin
new( Lista .Ultimo^.Prox) ;
Lista .Ultimo := Lista .Ultimo^.Prox;
Lista .Ultimo^.Item := x;
Lista .Ultimo^.Prox := n i l
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Operações 5
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 13
Operações sobre Lista UsandoApontadores
procedure Retira (p:Apontador ; var Lista : TipoLista ;
var Item:TipoItem) ;
{−−Obs. : o item a ser retirado e
o seguinte ao apontado por p −−}
var q: Apontador;
begin
i f Vazia ( Lista ) or (p = n i l ) or (p^.Prox = n i l )
then writeln ( ’Erro : Lista vazia ou posicao nao existe ’ )
else begin
q := p^.Prox ; Item := q^.Item ; p^.Prox := q^.Prox;
i f p^.Prox = n i l then Lista .Ultimo := p;
dispose (q) ;
end;
end;
procedure Imprime ( Lista : TipoLista ) ;
var Aux: Apontador;
begin
Aux := Lista .Primeiro^.Prox;
while Aux <> ni l do
begin
writeln (Aux^.Item.Chave) ; Aux := Aux^.Prox;
end;
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Operações 6
Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 13
Operações sobre Lista UsandoApontadores
procedure Retira (p:Apontador ; var Lista : TipoLista ;
var Item:TipoItem) ;
{−−Obs. : o item a ser retirado e
o seguinte ao apontado por p −−}
var q: Apontador;
begin
i f Vazia ( Lista ) or (p = n i l ) or (p^.Prox = n i l )
then writeln ( ’Erro : Lista vazia ou posicao nao existe ’ )
else begin
q := p^.Prox ; Item := q^.Item ; p^.Prox := q^.Prox;
i f p^.Prox = n i l then Lista .Ultimo := p;
dispose (q) ;
end;
end;
procedure Imprime ( Lista : TipoLista ) ;
var Aux: Apontador;
begin
Aux := Lista .Primeiro^.Prox;
while Aux <> ni l do
begin
writeln (Aux^.Item.Chave) ; Aux := Aux^.Prox;
end;
end;
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Vantagens:I Permite inserir ou retirar itens do meio da lista a um
custo constante (importante quando a lista tem deser mantida em ordem);
I Elementos consecutivos na lista não implica emelementos consecutivos na representação (ordemlógica e não física);
I Bom para aplicações em que não existe previsãosobre o crescimento da lista (o tamanho máximo dalista não precisa ser definido a priori).
Desvantagem: utilização de memória extra paraarmazenar os apontadores.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Alocação Encadeada
Vantagens:I Permite inserir ou retirar itens do meio da lista a um
custo constante (importante quando a lista tem deser mantida em ordem);
I Elementos consecutivos na lista não implica emelementos consecutivos na representação (ordemlógica e não física);
I Bom para aplicações em que não existe previsãosobre o crescimento da lista (o tamanho máximo dalista não precisa ser definido a priori).
Desvantagem: utilização de memória extra paraarmazenar os apontadores.
Introdução TAD Lista Linear Implementação Tipos de Representação Referências
Knuth, D. E. (1997).The art of computer programming, volume 1 (3rd ed.):fundamental algorithms.Addison Wesley Longman Publishing Co., Inc., Redwood City,CA.
Lee, H. D. (2000).Notas didáticas.Algoritmos e Estruturas de Dados.
Ziviani, N. (2004).Projeto de Algoritmos.Thomson Learning, São Paulo, SP, 2 edition.