Notas de aula da disciplina IE - Estruturas de Dados I Paulo Eustáquio Duarte Pinto (pauloedp arroba ime.uerj.br) Árvores de Busca: Atualização/Busca - caso médio: O(log n) Atualização/Busca - pior caso: O(log n) Pergunta: Pode-se melhorar os dados anteriores? dezembro/ Resposta: Pode-se melhorar o primeiro, ao custo de piorar o segundo. Pergunta: Como tentar buscar mais rapidamente? Resposta: usando-se um vetor e fazendo a transformação chave/endereço, para localizar a chave no vetor. Esquema: = conjunto de Função hash - :. Pergunta: pode ser uma função injetora? Resposta: quase nunca.(pensar no paradoxo do aniversário.) = conjunto de. = vetor[] = Função hash, transforma chave em endereço em. = vetor[] = Função hash, transforma chave em endereço em Função hash - : - Sinônimos Já que é tão difícil funções injetoras, tem-se que conviver com sinônimos. e são sinônimos To hash = bagunçar, picar. = conjunto de = vetor[] = Função hash, transforma chave em endereço em mas. - Função hash - Propriedades ) Cálculo rápido. ) Gerar endereços na faixa (-) ) Gerar distribuição uniforme de sinônimos ) Não preservar propriedades das chaves e são sinônimos. = conjunto de = vetor[] = Função hash, transforma chave em endereço em
- Função hash - Função hash a) Resto da Divisão:. b) Ou Exclusivo:. = mod +. a.) cálculo rápido a.) gera endereços na faixa a.) gera distribuição uniforme de sinônimos (é periódica com período ) -. a.) preserva sequência(!?) = a + b +. b.) cálculo rápido b.) gera endereços na faixa = p b.) gera distribuição uniforme de sinônimos Exemplo b.) não preserva sequência(!?) - Função hash - Função hash c) Função de ultiplicação: = (.b mod R) mod +. c.) cálculo rápido c.) gera endereços na faixa c.) pode gerar distribuição uniforme de sinônimos. Depende de R, b,. R =, =, b = c.) não preserva sequência. d) Outras Funções hash d.) Dobradura d.) etade do quadrado d.) Seleção de partes da chave d.) Segredos industriais.. ÉTOS. ) Encadeamento Exterior ) Encadeamento Interior (Listas coligadas) ) Endereçamento aberto ) Endereçamento aberto com duplo hashing ) Encadeamento Exterior I I
) Encadeamento Exterior ) Encadeamento Exterior I I I I ) Encadeamento Exterior ) Encadeamento Exterior I I Busca(, i, p): p [i]; Enquanto (p Nulo) e (p.c ): p p.prox; i ; Busca(, i, p); Se (p = Nulo) Então: Alocar(p); p.c ; p.prox [i]; [i] p; I ) Encadeamento Exterior - Análise ) Encadeamento Exterior - Análise elhor caso médio: = elhor caso médio: =
) Encadeamento Exterior - Análise da Busca ) Encadeamento Interior (listas coligadas) elhor caso médio: = Caso médio (média): = N(+α/) α = N/ = fator de carga. α. Idéia: criar listas encadeadas de sinônimos para cada endereço do vetor, no próprio vetor. I I ) Encadeamento Interior (listas coligadas) Busca(, ant, p): p ; ant p; Enquanto ([p].prox Nulo) e ([p].c ): ant p; p [p].prox; Se ([p].c ) Então p Nulo; Busca(, ant, p); Se (p = Nulo) e (n < ) Então: Se ([ant].c = ) Então p ant; [p].c ; Senão j Next(ant); [j].c ; [ant].prox j; p j; n n+; I ) Encadeamento Interior - Análise elhor caso médio: = ) Encadeamento Interior - Análise ) Encadeamento Exterior - Análise da Busca elhor caso médio: = m K m- - - elhor caso médio: = Caso médio (média): = N(+.α) α = N/ = fator de carga. m K m- - α
Exercício: Criar as tabelas hashing para Encadeamento Interior/Exterior, usando como entrada o IXSTRING, = e h(letra) = Pos(letra) od +. Calcular para cada tabela. ) Endereçamento Aberto Idéia: usar apenas um vetor, sem lins e colocar sinônimos em outra posição. ma das formas é procurar, circularmente, a próxima posição disponível. I I = (++++++)/= / ) Endereçamento aberto ) Endereçamento aberto - Análise Busca(, ant, p): p ; ant p; Enquanto ([p] Nulo) e ([p] ): ant p; p p mod + ; Se ([p] = Nulo) Então p Nulo; Busca(, ant, p); Se (p = Nulo) e (n < -) Então: [ant] ; p ant; I elhor caso médio: = ) Endereçamento aberto - Análise ) Endereçamento aberto - Análise elhor caso médio: = elhor caso médio: = Caso médio (média): = p/ α =. α = N/ = fator de carga α.
) Endereçamento Aberto com duplo hash Idéia: usar uma segunda função para determinar os saltos na busca de espaço. h () h () I I = (++++++)/= / ) Endereçamento aberto com duplo hashing Busca(, ant, p): p h (); ant p; s h (); Enquanto ([p] Nulo) e ([p] ): ant p; p (p+s-) mod + ; Se ([p] = Nulo) Então p Nulo; Busca(, ant, p); Se (p = Nulo) e (n < -) Então: [ant] ; p ant; I ) Endereçamento Aberto com duplo hash ) Endereçamento Aberto com duplo hash Requisito importante para h (): h () h () I I Requisito importante para h (): relativamente primos a!! h () h () I I gerar números Exemplos: a) ímpar e h () = mod b) primo e h () = mod - + ) Endereçamento aberto com duplo hash - Análise ) Endereçamento aberto com duplo hash - Análise elhor caso médio: = elhor caso médio: =
) Endereçamento aberto com duplo hash - Análise elhor caso médio: = Caso médio (média): = p/ α =. α = N/ = fator de carga Exercício: Criar as tabelas hashing para Endereçamento aberto simples e com duplo hash, usando como entrada o IXSTRING, = e h(letra) = Pos(letra) od +. Calcular para cada tabela. α. Fim