Hash tables Fábio Nakano
Bibliografia CLR Ziviani
Conjuntos dinâmicos Operações Aplicações Insere Busca Elimina dicionários; tabelas de símbolos; índices;
Em um vetor
Listas Ligadas Classe LinkedList Complexidade de tempo para inserção (no início / final) busca remoção (no início / final)
Espalhar – uma bagunça organizada Sei exatamente onde está cada folha de papel na minha mesa!!! É uma questão de saber onde procurar !!!
Endereçamento direto Imagine que possa se espalhar elementos por toda a memória... ... e recuperá-los em tempo constante!!!
Calculando chaves No computador qualquer coisa é codificada e representada como conteúdo de memória. Este conteúdo por sua vez, pode ser visto como números. int ascii_of_A = (int)'A'; // retorna 65 int calculaChave (String txt) { int h=0; for (int i = 0; i < txt.length(); i++) { int chr = txt.charAt(i); h+= chr; } return (h%103)
Hash É o jeito mais eficiente de saber onde procurar. Calcula um índice baseado na chave que se quer buscar , h(chave). O cálculo tem que ser feito em tempo constante. Para este índice ser “bom”, precisa ter a propriedade de espalhar os elementos uniformemente.
E em caso de colisão??? Encadeamento...
Hash simples e uniforme com colisões resolvidas por encadeamento fator de carga (ou taxa de ocupação) Complexidade de uma busca sem sucesso Complexidade (média de pior caso) de uma busca com sucesso
Como gerar “boas” funções Método da divisão Método da multiplicação h(k)=k mod m este método funciona melhor quando m é primo problema: primos grandes sucessivos são muito distantes entre si. h(k)=m*(A*k-floor(A*k)) há valores de A melhores que outros. Um deles é a chamada “proporção áurea” ou número de ouro.