Você está na página 1de 16

TECNICA DE DISPERSÃO

VRS
DICIONÁRIO DE LÍNGUAS
Aula #10 (Teorica)

Dr. Ticongolo, Inacio Gaspar


___________________________________________________________________
Maio de 2015
Introdução
 Até aqui, a estrutura com melhor tempo de execução
nas operações é a Lista Duplamente Ligada.
 Imaginemos as seguintes situações:
 (1) Lista Duplamente Ligada que guarda impressões
digitais de todos os moçambicanos;
 (1.1) Cada cidadão tem a sua impressão digital diferente de todos,
isto é, ao inserir digitais, não deve haver repetição.

 (1.2) Para busca de uma digital deve-se percorrer todos as digitais


linearmente.

 (1.1) e (1.2) consumiriam tempo linear, o que seria inviável para


nossa aplicação, que possui um volume elevado de dados (todos os
moçambicanos).
Introdução (cont.)
 
 (2) Lista Duplamente Ligada de significados das
palavras da língua portuguesa.
 (2.1) Cada palavra é diferente de todas as outras, isto é, ao
inserir elementos, não deve haver repetição.

 (2.2) Para consultar o significado de cada palavra deve-se


percorrer todos os elementos linearmente.

 (2.1) e (2.2) consumiriam tempo linear, o que seria inviável


para nossa aplicação, que possui um volume elevado de
dados (todas as palavras de língua portuguesa)

 Para alem destes, existem outros exemplos em que a


aplicação directa da lista duplamente ligada seja
inconveniente na inserção e busca.
Introdução (cont.)
 
Para Resolver estes inconvenientes, ao invés de inserção ou
busca tomando em conta todos os elementos já existentes na
estrutura, vamos restringir o espaço de inserção e busca,
ignorando o maior número possível de elementos.

Para atingir este propósito, vamos separar os elementos por


categorias. Desta forma, para buscar um elemento, basta
conhecer a sua categoria, isto, irá permitir que ignoremos
todos os elementos doutras categorias.

Os elementos serão dispersos por categorias e para tal


aplicaremos uma técnica denominada técnica de Dispersão
ou Espalhamento.
Técnica de Dispersão
 A técnica de Dispersão consiste basicamente de duas partes:
a Função de Espalhamento (“Função de Hash”) e a Tabela de
Espalhamento (“Tabela de Hash”).
Técnica de Dispersão
 Em condições normais, a Função de Espalhamento deveria
gerar índices diferentes para elementos diferentes. Mas, na
prática, ela pode, eventualmente, gerar o mesmo índice para
elementos distintos.
 Quando isto ocorre, dizemos que houve uma colisão.

 No exemplo da estrutura de significados de palavras da


língua portuguesa, uma colisão acontece quando duas
palavras distintas iniciam com mesma letra.

 Para resolver o problema da colisão, muitas vezes, a Tabela é


combinada com outra estrutura de dados. Isso ocorre da
seguinte forma: cada posição da Tabela pode armazenar uma
Lista, uma Árvore ou outra estrutura de dados em vez de
apenas um elemento. Desta forma conseguimos armazenar
mais de um elemento na mesma posição da Tabela.
Dicionário de Linguas
 A título de exemplo, vamos implementar uma estrutura para
palavras duma língua utilizando a técnica de Espalhamento, e
denominaremos de Dicionário.

 Ora vejamos:
 O alfabeto das línguas tem 26 letras (de A a Z), o que significa
que a tabela hashing terá 26 posições (dado que o número de
posições é fixo, podemos usar array).

 Como o número de colisões por categoria não é previamente


conhecido, vamos aplicar a lista duplamente ligada para cada
categoria de palavras. E, cada letra inicial de uma palavra
representa uma categoria.
Dicionário de Linguas (cont.)
Dicionário de Linguas (cont.)
 Como Obteremos o código de espalhamento (índice)?

 Temos:
 Objecto= Palavra
 Função= (primeira letra da palavra)%26
 Código= resultado da Função
Dicionário de Linguas (cont.)
 TUDO PRONTO!!!

 VAMOS A IMPLEMENTAÇÃO
Antes, suponhamos que os códigos inteiros das letras na tabela
ASCII são os indicados a baixo:

Letra a b c d e f g h i j k l m n o p q r s t u v w x y z
Cód 2 5 20 47 48 27 51 12 3 6 9 7 10 17 26 4 11 8 49 50 15 18 14 19 16 39

 Efectua a inserção das seguintes palavras:


 Aula, Teórica, Estrutura, Base, Dado, Informática,
Telecomunicação, Instituto, Superior, Algoritmo, Instrução,
Código, Alfabeto.
  
 Resultado:
Dicionário de Linguas (cont.)
 Resultado:
Dicionário de Linguas (cont.)
 Vantagens em relação a lista duplamente ligada:

(1) Na Inserção, ao invés de percorrermos toda a estrutura para


verificar se o elemento a inserir já existe na estrutura ou não
(para evitar a repetição de elementos), percorremos somente
a sublista correspondente a categoria do elemento a inserir.

(2) Na busca, ao invés de tomar toda a estrutura para busca


(onde em alguns casos percorremos todos os elementos
para encontrarmos o elemento procurado), tomamos apenas
a sublista que corresponde ao elemento procurado.
Dicionário de Linguas (cont.)
 public class Vocábulo{
 String palavra;
 String significado;
 public Vocabulo(){
 }
  
 public Vocabulo (String palavra, String significado){
 this.palavra=palavra;
 this.significado=significado;
 }
 public void setPalavra(String palavra){
 this.palavra=palavra;
 }
  
 public void setSignificado(String significado){
 this.significado =significado;
 }
  
 public String getPalavra(){
 return palavra;
 }
  
 public String getSignificado (){
 return significado;
 }
 }// Fim Vocabulo
Dicionário de Linguas (cont.)
 public interface InterfaceEspalhamento {
 public void adiciona(String palavra) ;
 public void adiciona(Vocabulo vocabulo);
 public void removeVocabulo(String palavra) ;
  
 public boolean contem(String palavra);
 public String consultaSignificado(String palavra);
  
 public int tamanho() ;
 }// Fim InterfaceEspalhamento
Dicionário de Linguas (cont.)
 public class Dicionario implements InterfaceEspalhamento{
 

 private ListaDuplamenteLigada tabelaHash[] = new ListaDuplamenteLigada[26];


 

 public Dicionário(){
 for (int i = 0; i < 26; i++) {
 ListaDuplamenteLigada lista = new ListaDuplamenteLigada();
 tabelaHash[i]=lista;
 }
 }
  //Funcao hash
 private int codigoHash(String palavra){
 return palavra.toLowerCase().charAt(0) % 26;
 }
 public void adiciona(Vocabulo vocabulo)
 public void adiciona(String palavra)
 public void removeVocabulo(Vocabulo vocabulo)
 public void removeVocabulo(String palavra)
 public void atribuiSignificado(String palavra, String significado)
 public boolean contem(String palavra)
 public Vocabulo pegaVocabulo(String palavra)
 public String consultaSignificado(String palavra)
 public int tamanho()
  } // Fim do Dicionario
  
FIM

Maputo, Maio de 2015

Você também pode gostar