[Estrutura de dados] O que é uma tabela hash? Como aplicá-lo a projetos front-end, prática de algoritmo

Índice

A diferença entre objeto e tabela de hash

método de hash

Cenários usados

Cenário 1: desduplicação de matriz

Cenário 2: conte o número de ocorrências de caracteres diferentes em uma string

Cenário 3: Saída da interseção de dois arrays, cada elemento no resultado de saída deve ser único


Definição de tabela de hash

Uma tabela hash, também chamada de tabela hash, é uma estrutura de dados que pode ser acessada diretamente de acordo com o valor do código da chave (chave). Ele acessa os registros mapeando os valores-chave para um local na tabela para agilizar as pesquisas. Essa função de mapeamento é chamada de função hash , e a matriz que armazena os registros é chamada de tabela hash . Em JavaScript, os objetos são muito semelhantes às tabelas de hash

A diferença entre objeto e tabela de hash

  • O valor da chave do objeto deve ser uma string, enquanto o hash pode ser qualquer valor
  • Os valores de chave no objeto são desordenados, enquanto o hash é ordenado
  • O número de valores-chave no objeto precisa ser obtido manualmente, enquanto o hash pode obter diretamente o número de valores-chave
  • Hashes podem armazenar 50% mais pares chave-valor do que objetos

método de hash

método set, usado para atribuir valores às chaves

let hash = new Map()

hash.set(bob, true) // Map(1) {bob => true}

método get, obtenha os dados de mapeamento correspondentes a um valor de chave e retorne os dados

let hash = new Map()

hash.set(bob, true) // Map(1) {bob => true}

hash.get(bob) // true

hash.get(2) // 获取不存在键值的数据会返回undefined 

O método has, para determinar se existe um valor de chave, retorna um valor booleano

hash.has(bob) // true

hash.has(89) // false

delete método, exclua o valor da chave

hash.delete(1) // 删除已有键值对

 atributo de tamanho, obtém o número de pares chave-valor da tabela de hash

hash.size // 2

Cenários usados

Cenário 1: desduplicação de matriz

// 哈希表实现数组去重
/**
 * @param {Array[]} oldArr
 * @return {Array[]}
 */
var uniq = function (oldArr) {
    // 增加代码的健壮性
    if (!oldArr || !oldArr instanceof Array ) {
      oldArr = []
    }
    let hash = new Map()
    let newArr = []
    for (let i = 0; i < oldArr.length; i++) {
      if (!hash.get(oldArr[i])) {
        newArr.push(oldArr[i])
        hash.set(oldArr[i], 1)
      }
    }
    return newArr
  }

Cenário 2: conte o número de ocorrências de caracteres diferentes em uma string

 
/**
 * @param {string} str
 * @return {Map}
 */
  var statistics = function (str) {
    if (!str.length) {
      return 
    }
    
    let hash = new Map() 
    // 分割字符串为数组
    let tempArr = str.split('')
    
    for (let i = 0; i < tempArr.length; i++) {
      // 设置每个键值的映射数值,存在则+1,不存在则设置为1
      hash.set(tempArr[i], (hash.get(tempArr[i]) || 0) + 1)
    }

    return hash
  }
  let str = 'abbbbcccccddddd'
  statistics(str) // Map(4) {'a' => 1, 'b' => 4, 'c' => 5, 'd' => 5}

Cenário 3: Saída da interseção de dois arrays, cada elemento no resultado de saída deve   ser único

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    if (nums1.length === 0 || nums2.length === 0) {
        return []
    }
    if (nums1.length < nums2.length) {
        const temp = nums1;
        nums1 = nums2;
        nums2 = temp
    }

    let hasSet = new Set(nums1)
    let resSet = new Set()
    for (let i = 0; i < nums2.length; i++) {
        hasSet.has(nums2[i]) && resSet.add(nums2[i])
    }
    
    return Array.from(resSet)
}; 

Acho que você gosta

Origin blog.csdn.net/haidong55/article/details/128226321
Recomendado
Clasificación