Anúncio
Anúncio

Mais conteúdo relacionado

Apresentações para você(20)

Anúncio

Último(20)

Anúncio

Estruturas de Dados - Tabelas de Espalhamento (Hash Table)

  1. Estruturas de Dados
  2. EstruturasdeDados Estruturas Lineares Pilha Stack Fila Queue Lista List Vetor e Matriz Array Estruturas Não-Lineares Tabela de Espalhamento Hash Table Árvore Tree as estruturas de dados
  3. Estruturas › Dados organizados em arranjos não lineares › Itens NÃO podem ser percorridos com uma única repetição ~
  4. › Nome usado em inglês para as Tabelas de Espalhamento › Inspirado na ideia de um ponto de entrada poder se espalhar (dispersar) em vários itens Chamadas também de Tabelas de Dispersão
  5. class HashTable { constructor () { this.table = {} this.length = 0 } // methods... } JavaScript Atributos da Estrutura
  6. Baseia-se em categorizar os itens criando chaves de identificação únicas (hash), que apontam para um ou mais itens armazenados naprática
  7. naprática jon snow8 arya stark bran stark 10 jaime lannister15 cersei lannister tyrion lannister 16 daenerys targaryen18 jon snow daenerys targaryen arya stark cersei lannister jaime lannister bran stark tyrion lannister Consegue imaginar o critério usado para gerar estas chaves?
  8. usandoainicial { j: ['jon snow', 'jaime lannister’], d: ['daenerys targaryen’], t: ['theon greyjoy', 'tyrion lannister’], a: ['arya stark’], s: ['sansa stark’], b: ['bran stark’], c: ['cersei lannister'] } A tabela principal é um objeto genérico Cada categoria gerada vira uma chave de atributo O valor de cada atributo é um vetor de itens daquela categoria Lógica para gerar
  9. hash (value) { return value[0] } JavaScript Exemplo de Funções Hash hash (value) { return value.length } ou
  10. { 8: ['jon snow’], 10: ['arya stark', 'bran stark’], 11: ['sansa stark’], 13: ['theon greyjoy’], 15: ['jaime lannister’], 16: ['cersei lannister', 'tyrion lannister’], 18: ['daenerys targaryen'] } Desta vez, o length de cada String inserida foi usado como critério. Isso seria uma vantagem? Qual será a melhor abordagem para hash? Lógica para gerar usandootamanho
  11. { 356180779: ['jon snow’], 374592295: ['bran stark’], 1156590191: ['daenerys targaryen’], 1409403303: ['jaime lannister’], 2600609194: ['tyrion lannister’], 2913731910: ['sansa stark’], 3103384452: ['theon greyjoy’], 4043766576: ['cersei lannister’], 4105310401: ['arya stark'] } A função hash ideal nunca geraria colisões, ou seja, chaves iguais nunca seriam obtidas para valores diferentes. Mas conseguir isso é custoso! Lógica para gerar semcolisõesnaschaves
  12. JavaScript Função Hash de Fowler-Noll-Vo hash (value) { let hash = 0x811c9dc5 value = Buffer.from(value) for (let i = 0; i < value.length; i++) { hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24) hash = hash ^ value[i] } return hash >>> 0 } Este código demonstra a implementação de uma das funções com melhor equilíbrio entre desempenho e unicidade das chaves geradas é conhecida por NFV1. Saiba mais: https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
  13. pra que usar? › Categorização dos dados › Desempenho em buscas! Teoricamente, as melhores tabelas são aquelas cujas funções hash sempre geram uma categoria por item Na prática, o peso de funções tão precisas pode estragar o desempenho, portanto, busque o equilíbrio
  14. insert (value) { let hashed = this.hash(value) if (this.table[hashed] === undefined) { this.table[hashed] = [] } this.length++ this.table[hashed].push(value) } JavaScript Inserir Item
  15. search (value) { let hashed = this.hash(value) if (this.table[hashed] !== undefined) { let index = this.table[hashed].indexOf(value) return this.table[hashed][index] } return null } JavaScript Buscar Item
  16. remove (value) { let hashed = this.hash(value) if (this.table[hashed] !== undefined) { let index = this.table[hashed].indexOf(value) if (index > -1) { this.length-- this.table[hashed].splice(index, 1) } } } JavaScript Remover Item
  17. import HashTable from './HashTable' let got = new HashTable() got.insert('jon snow') got.insert('daenerys targaryen') got.insert('cersei lannister') got.insert('tyrion lannister') got.remove('jon snow') got.insert('jon targaryen') let who = await prompt('Qual o melhor em Game of Thrones? ') if (got.search(who)) { console.log('Perfeito, nós também achamos!’) console.log('Quando se joga o jogo dos tronos, ou vence ou morre.') } else { console.log('Péssima escolha!’) console.log('A noite é escura e cheia de terrores.') } JavaScript Exemplo de Utilização
Anúncio