Vous êtes sur la page 1sur 11

Mapas - maps

 Um mapa não define uma estrutura de dados


propriamente dita
 Define um meio de mapear chaves em
elementos
 Um mapa armazena pares de chaves-elementos
 Num mapa não podem existir chaves repetidas
 Num mapa cada chave só pode ter um
elemento associado
 A ordem dos elementos num mapa é irrelevante
 O conceito Mapa define apenas uma interface

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Mapas - maps
 O que se pode fazer num mapa?
 Adicionar chaves e elementos
 Remover elementos (definidos através das
chaves)
 Obter o elemento associado a uma chave
 Alterar o elemento associado a uma chave
 Verificar se uma chave está presente do mapa
 Ver tamanho do mapa
 Ver se o mapa está vazio
 Limpar o mapa

 A principal razão de usar um mapa é fazer


pesquisas, logo estas terão se ser
extremamente rápidas

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa


Mapas - maps
Um mapa define uma interface
semelhante à seguinte:
interface Mapa {

public boolean adicionar( Object chv, Object elem );


public boolean alterar( Object chv, Object elem );
public Object retirar( Object chv );
public Object getElemento( Object chv );
public boolean estaPresente( Object chv );
public int getTamanho();
public boolean estaVazio();
public void limpar();

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Mapas - maps
 Como implementar um Mapa?
 Com qualquer uma das estruturas dadas
anteriormente
 Basta que essas estruturas garantam a
correspondência entre as chaves e os elementos
e a sua não repetição
 Ou criar uma classe de fachada que use uma das
estruturas dadas que garanta que não há
elementos repetidos e a correspondência entre
elementos e chaves
 Atenção que algumas estruturas dadas, árvores
binárias de pesquisa, exigem que, pelo menos, as
chaves possam ser ordenáveis
As árvores binárias normais não obrigam a isso

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa


Mapas - maps
Será que com um Vector se consegue
implementar um mapa?
 Claro que sim, mas há estruturas mais
eficientes.
 Lembrar que um mapa deve fazer
pesquisas rápidas

As estruturas melhores serão


obviamente as árvores e as tabelas de
hash
 Pelo menos as tabelas de hash assumem
logo estas tarefas de forma directa
Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Mapas - maps
 Implementação de um mapa recorrendo a uma
lista ligada
 Usa um truque comum:
 definir uma classe que faça o agrupamento de
chaves
É preciso ter cuidado! Como as pesquisas vão ser
feitas por chaves é necessário que ao comparar
elementos só se ligue às chaves
Se as chaves forem ordenáveis (não é necessário
nos mapas) é preciso olhar apenas para as
chaves
 depois é só usar uma lista normal
Não é necessário implementar uma lista com
chaves

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa


Mapas - maps
 Implementação de um mapa recorrendo a uma lista ligada

class MapaLista implements Mapa {

private class ParChaveElemento implements Comparable {


Comparable chave;
Object item;

ParChaveElemento( Comparable chv, Object elem) {


chave = chv;
item = elem;
}

public boolean equals( Object p ){


// só compara as chaves
return chave.equals( ((ParChaveElemento)p).chave );
}

public int compareTo( Object p ){


return chave.compareTo( ((ParChaveElemento)p).chave );
}
}
}
Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Mapas - maps
 Implementação
class de um
MapaLista implements mapa
Mapa { recorrendo a uma lista
ligada
private Lista lista = new Lista();

public boolean adicionar( Comparable chv, Object e ){


ParChaveElemento par = new ParChaveElemento( chv, e );
if( lista.estaPresente( par ) )
return false;
lista.adicionar( par );
return true;
}

public boolean alterar( Comparable chv, Object e ){


// criar um par só para pesquisas
ParChaveElemento par = new ParChaveElemento( chv, null );
// solução com iteradores seria melhor!!!!
int idx = lista.procurar( par );
if( idx == -1 )
return false;
lista.getElemento( idx ).item = e;
return true;
}
} Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa
Mapas - maps
 Implementação de um mapa recorrendo a uma lista ligada
class MapaLista implements Mapa {

public Object retirar( Comparable chv ){


// criar um par só para comparações
ParChaveElemento par = new ParChaveElemento( chv, null );

// retorna o elemento retirado (é o item do par)


return lista.remover( par ).item;
}

public boolean estaPresente( String chv ){


// criar um par só para comparações
ParChaveElemento par = new ParChaveElemento( chv, null );

return lista.estaPresente( par );


}

public int getTamanho(){


return lista.getTamanho();
}
}
Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Mapas - maps
Implementação de um mapa recorrendo
a uma lista ligada
class MapaLista implements Mapa {

public boolean estaVazio( ){


return lista.estaVazia();
}

public void limpar( ){


lista.limpar();
}

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa


MultiMapas - maps
 É um tipo de mapa em que para a mesma
chave se podem ter vários elementos
 Mas em cada mapa só se pode ter uma vez a
chave
 Como se pode implementar uma estrutura
destas?
 Com um mapa normal
 A chave mantém-se
 O elemento passa a ser uma lista de elementos
Sempre que se adiciona ao mapa um elemento,
este é na realidade adicionado à lista de
elementos associados a essa chave

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Conjuntos - Sets
 Um conjunto não é mais que uma colecção de
elementos
 É exactamente o conceito de conjunto em
matemática
 Num conjunto não pode haver elementos
repetidos
 Num conjunto a ordem dos elementos é
arbitrária
 Não define uma estrutura propriamente dita
 Define apenas uma interface, ou seja, o que se
pode fazer com um conjunto
 Rever as definições matemáticas ☺

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa


Conjuntos - Sets
 O que se pode fazer num conjunto?
 Adicionar elementos
 Remover elementos
 Verificar se um elemento faz parte do conjunto
 Ver cardinalidade do conjunto (tamanho)
 Ver se é um conjunto vazio
 Retirar todos os elementos do conjunto
 Intercepções
 Uniões
 Diferenças

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Conjuntos - Sets
Um set define uma interface semelhante
à seguinte:
interface Set {

public boolean adicionar( Object e );


public boolean retirar( Object e );
public boolean estaPresente( Object e );
public Object get( int i );
public int getTamanho();
public boolean estaVazio( );
public void limpar( );
public Set interseccao( Set s );
public Set uniao( Set s );
public Set diferenca( Set s );

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa


Conjuntos - Sets
Como implementar um set?
 Com qualquer uma das estruturas dadas
anteriormente
 Basta que essas estruturas garantam que
não há elementos repetidos
 Ou criar uma classe de fachada que use
uma das estruturas dadas que garanta
que não há elementos repetidos

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Conjuntos - Sets
Criar um set com o auxílio de um Vector
class SetVector implements Set {

private Vector vector = new Vector();

public boolean adicionar( Object e ){


if( vector.estaPresente( e ) )
return false;
vector.adicionar( e );
return true;
}

public boolean retirar( Object e ) {


return vector.retirar( e );
}

public boolean estaPresente( Object e ){


return vector.estaPresente( e );
}

// …
} e Estruturas de Dados
Algoritmos 2009/10 F.Sérgio Barbosa
Conjuntos - Sets
Criar um set com o auxílio de um Vector
class SetVector implements Set {

public Object getElemento( int idx ){


return vector.getElemento( idx );
}

public int getTamanho(){


return vector.getTamanho();
}

public boolean estaVazio( ){


return vector.estaVazio();
}

public void limpar( ){


vector.limpar();
}

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Conjuntos - Sets
Criar um set com o auxílio de um Vector
class SetVector implements Set {

public Set uniao( Set s ){

Set uniao = new SetVector();

// copiar todos os elementos do meu set


for( int i = 0; i < vector.getTamanho(); i++ ){
Object e = vector.getElemento( i );
uniao.adicionar( e );
}

// copiar todos os elementos do outro set


// o adicionar garante que não há repetidos
for( int i = 0; i < s.getTamanho(); i++ ){
Object e = s.getElemento( i );
uniao.adicionar( e );
}

return uniao;
}
} e Estruturas de Dados
Algoritmos 2009/10 F.Sérgio Barbosa
Conjuntos - Sets
Criar um set com o auxílio de um Vector
class SetVector implements Set {

public Set interseccao( Set s ){

Set inter = new SetVector();

// copiar os elementos do outro set que


// também estejam no meu set
for( int i = 0; i < s.getTamanho(); i++ ){
Object e = s.getElemento( i );
if( vector.estaPresente( e ) )
inter.adicionar( e );
}

return inter;
}

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Conjuntos - Sets
Criar um set com o auxílio de um Vector
class SetVector implements Set {

public Set diferenca( Set s ){

Set dif = new SetVector();

// copiar os que estão no meu que não estão no outro


for( int i = 0; i < vector.getTamanho(); i++ ){
Elemento e = vector.getElemento( i );
if( !s.estaPresente( e ) )
dif.adicionar( e );
}

return dif;
}

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa


Conjuntos - Sets
Há um tipo especial de Conjunto que são
os conjuntos disjuntos
 É um conjunto de conjuntos
Qualquer elemento de um conjunto não
pode estar presente nos outros conjuntos
Como são apenas uma curiosidade
matemática não vamos aprofundar este
assunto

Algoritmos e Estruturas de Dados 2009/10 F.Sérgio Barbosa

Vous aimerez peut-être aussi