UNIP - Ciência da Computação e Sistemas de Informação
Estrutura de Dados
AULA 10
Recursividade e Tabelas Hash
Estrutura de Dados
1
Recursividade
• Ao atingir o topo da escada, a tarefa de a subir está terminada;
– Enquanto o topo não for atingido;
• Avançar um degrau;
• e retomar a tarefa de subir as escadas, mas agora, tendo já
avançado um dos degraus, a dimensão do problema aparece
mais reduzida.
• Uma função que é dita recursiva é aquela que invoca ela mesma.
• Porém é preciso um cuidado especial para não cairmos em um
looping infinito.
• Geralmente, para que uma função não fique invocando ela mesma
indefinidamente, devemos definir, na função, testes condicionais
sobre o parâmetro para saber onde devemos parar de invocar a
função.
• Recursividade brinda soluções simples e elegantes, evitando
estruturas de repetição.
Estrutura de Dados
2
Recursividade
• Fatorial
–
–
–
–
–
–
–
0! = 1 (por convenção)
1! = 1 = 1 * 0!
2! = 2 * 1 = 2 * 1! = 2 * 1 = 2
3! = 3 * 2 * 1 = 3 * 2! = 3 * 2 = 6
4! = 4 * 3 * 2 * 1 = 4 * 3! = 4 * 6 = 24
...
n! = n * (n-1) * (n-2) * ... * 1 = n * (n - 1)!
•
•
Podemos daqui concluir que:
Caso base: 0! = 1 ; caso em que o valor é conhecido por definição
ou convenção
• Caso geral n! = n * (n-1)! ; caso que recorre à própria função que se
pretende resolver
Estrutura de Dados
3
Recursividade
public class Fatorial{
public static void main (String args []){
Scanner ler = new Scanner(System.in);
int n;
System.out.printf("Digite um inteiro positivo: ");
n = ler.nextInt ();
System.out.printf("%d! = %d\n", n, fatorial(n));
System.exit(0);
}//fim main
public static int fatorial(int n){
if(n == 1)
return 1;
else
return (n * fatorial(n-1));
}//fim método fatorial
}//fim classe
Estrutura de Dados
4
Tabelas Hash
• Uma tabela hash é uma estrutura que permite associar
uma chave a um valor e, posteriormente, ter acesso ao
valor a partir de sua chave associada. A chave é
transformada por uma função em uma posição na tabela;
usando sempre essa transformação, a localização de
chaves na tabela é realizada rapidamente.
Fonte: http://www.dca.fee.unicamp.br/cursos/PooJava/collections/h_hasht.html
Estrutura de Dados
5
Tabelas Hash
• Hashing é uma tabela composta por um vetor com M
posições e cada posição representa um endereço onde
os elementos a serem armazenado nele possuem um
valor chave que é utilizado para calcular o endereço na
tabela onde deverão ser alocados.
• Para criação da função hashing é o método da divisão
onde uma chave X é mapeada em M endereços da tabela
hashing calculando o resto da divisão de X por M, ou
seja: h(x) = x mod m.
Fonte: http://www.manfred.com.br/index.php/bsi/estrutura-de-dados-i/146-aula14-tabela-hash-em-java
Estrutura de Dados
6
Tabelas Hash
h(x) = x mod m.
• Exemplo:
• Em uma tabela hashing de tamanho 10 e a chave inserida é
100 será armazenado na posição 0.
• Ao aplicar a função de hashing sobre um conjunto de chaves,
duas ou mais chaves podem ser mapeadas para o mesmo
endereço, esta situação é chamada de colisão, para resolver
este problema é utilizado o encadeamento dos endereços da
tabela hashing ou se usa de outra alternativa, como a do
endereçamento aberto.
Estrutura de Dados
7
Tabelas Hash
• Exemplo de codificação em Java de tabelas Hash
pode ser encontrado em:
Fonte: http://www.manfred.com.br/index.php/bsi/estrutura-de-dados-i/146-aula14-tabela-hash-em-java
Estrutura de Dados
8
Download

MC111E – Introdução ao Processamento de Dados Algoritmos e