详解JavaScript实现哈希表

yizhihongxing

详解JavaScript实现哈希表

什么是哈希表

哈希表是一种常见的数据结构,它可以提供快速的插入、查找和删除操作,其时间复杂度为 O(1) 。

哈希表的主要思想是将数据元素经过哈希(hash)函数的映射后,存储到一个数组中。哈希函数 将插入的元素映射到一个数组下标上,这个下标对应的元素就是这个元素所对应的值。在查找时,再使用同样的哈希函数,得到元素所对应的下标,即可查找到这个元素。

哈希函数的实现

哈希函数的实现是哈希表的核心。常用的哈希函数有很多种,这里介绍一种简单的哈希函数:取余法。

取余法的思路是将元素的值除以哈希表的大小,得到的余数就是元素的哈希值。例如,如果哈希表的大小为 10,插入元素 20,则 20 % 10 = 0,即元素的哈希值为 0。

以下是一个用取余法实现的哈希函数的示例:

function hash(key, length) {
  return key % length;
}

哈希冲突的处理

在哈希表中,不同的元素可能会映射到同一个下标上,这种现象称为哈希冲突。哈希冲突通常有两种处理方法:

  • 拉链法(链地址法):将哈希值相同的元素保存在同一个链表中。当查找一个元素时,首先找到对应的链表,然后在链表中进行线性查找。插入和删除操作也是同样的方式,在链表中进行插入和删除。
  • 开放地址法:当发生哈希冲突时,通过某种方法寻找下一个可用的位置,然后将元素插入到该位置。查找元素时,也需要按照一定的规则寻找后续位置。

以下是一个使用拉链法处理哈希冲突的示例:

class HashTable {
  constructor() {
    this.table = new Array(137);
    for (let i = 0; i < this.table.length; ++i) {
      this.table[i] = new LinkedList();
    }
  }

  put(data) {
    const pos = this.hash(data);
    this.table[pos].append(data);
  }

  get(key) {
    const pos = this.hash(key);
    return this.table[pos].find(key);
  }

  hash(data) {
    let total = 0;
    for (let i = 0; i < data.length; ++i) {
      total += data.charCodeAt(i);
    }
    return total % this.table.length;
  }
}

class LinkedList {
  constructor() {
    this.head = null;
  }

  append(data) {
    const node = new Node(data);
    let current = this.head;
    if (current === null) {
      this.head = node;
    } else {
      while (current.next !== null) {
        current = current.next;
      }
      current.next = node;
    }
  }

  find(key) {
    let current = this.head;
    while (current !== null) {
      if (current.data.key === key) {
        return current.data.value;
      }
      current = current.next;
    }
    return null;
  }
}

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

使用哈希表的示例

以下是一个使用哈希表统计单词数量的示例:

const words = 'the quick brown fox jumped over the lazy dog'.split(' ');
const counter = new Map();
for (const word of words) {
  if (counter.has(word)) {
    counter.set(word, counter.get(word) + 1);
  } else {
    counter.set(word, 1);
  }
}
console.log(counter);

另一个使用哈希表实现 LRU 缓存淘汰算法的示例:

class LRUCache {
  constructor(capacity) {
    this.capacity = capacity;
    this.cache = new Map();
  }

  get(key) {
    if (this.cache.has(key)) {
      const value = this.cache.get(key);
      this.cache.delete(key);
      this.cache.set(key, value);
      return value;
    }
    return -1;
  }

  put(key, value) {
    if (this.cache.has(key)) {
      this.cache.delete(key);
    } else if (this.cache.size >= this.capacity) {
      const keyToDelete = this.cache.keys().next().value;
      this.cache.delete(keyToDelete);
    }
    this.cache.set(key, value);
  }
}

以上就是详解 JavaScript 实现哈希表的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JavaScript实现哈希表 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • js获取dom的高度和宽度(可见区域及部分等等)

    要获取DOM元素的宽度和高度,我们可以使用JavaScript中的clientWidth和clientHeight属性。这两个属性返回的是DOM元素的可视区域大小,不包括边框和外边距。以下是获取DOM元素宽度和高度的代码: const element = document.getElementById(‘myElement’); const elementW…

    JavaScript 2023年6月10日
    00
  • javascript之大字符串的连接的StringBuffer 类

    StringBuffer 类是一个在 JavaScript 中实现字符串连接的工具类,它可以支持大字符串的高效连接,同时减少了连接大字符串时产生的多余内存自动分配。 使用 StringBuffer 类的基本步骤 StringBuffer 类的基本使用步骤分以下三步: 创建一个 StringBuffer 对象进行实例化 使用 append 方法向 String…

    JavaScript 2023年5月28日
    00
  • JavaScript模拟实现”双11″限时秒杀效果

    下面是“JavaScript模拟实现”双11″限时秒杀效果”的完整攻略。 步骤一:准备工作 首先,在页面中添加一个倒计时的 DOM 元素。 然后,在 JavaScript 中设置秒杀开始和结束的时间,并将其转换为 Date 对象。 var startTime = new Date(‘2021-11-11 00:00:00’).getTime(); // 秒杀…

    JavaScript 2023年6月11日
    00
  • Chrome扩展页面动态绑定JS事件提示错误

    Chrome扩展开发中,我们经常需要在选项页面或者弹窗页面中动态绑定JS事件。但是在实际开发的过程中,发现有时候动态绑定事件会出现错误,需要我们进行排查。下面是一个完整攻略,帮助开发人员解决这个问题。 1. 确认目标事件是否正确绑定 在进行动态绑定事件时,我们需要确认目标事件是否正确绑定。例如,我们在页面中找到一个按钮,需要在按钮上动态绑定click事件,如…

    JavaScript 2023年6月10日
    00
  • 用js计算页面执行时间的函数

    首先,在计算页面执行时间之前,需要先记录页面开始加载的时间和页面加载完成的时间。我们可以使用window对象的performance属性来实现。 页面开始加载的时间: const loadStartTime = window.performance.timing.navigationStart; 页面加载完成的时间: window.onload = func…

    JavaScript 2023年5月27日
    00
  • AJAX入门之深入理解JavaScript中的函数

    下面我来详细讲解“AJAX入门之深入理解JavaScript中的函数”的完整攻略。 AJAX入门 在开始讲解 AJAX (Asynchronous Javascript And XML)之前,我们需要先了解一下 JavaScript 中的函数。 JavaScript 函数 JavaScript 函数可以分为两类,一类是声明式函数,另一类是表达式函数。 声明式…

    JavaScript 2023年5月28日
    00
  • 详解JavaScript 中的 replace 方法

    详解JavaScript 中的 replace 方法 什么是 replace 方法 在JavaScript中,replace方法属于字符串对象的方法,它被用于在字符串中用一个新的字符替换匹配的字符。replace方法有两种常用的用法:用正则表达式替换匹配部分和将一个字符串替换成另一个字符串。replace方法的语法如下: string.replace(sea…

    JavaScript 2023年5月28日
    00
  • JavaScript的Function详细

    JavaScript的Function详细攻略 什么是函数 函数是一段能够完成特定任务的可重复使用的代码。它们可以接受输入和返回输出。 在JavaScript中,函数是一等公民,这意味着它们被认为是值,并且可以作为参数传递给其他函数或由其他函数返回。 函数定义如下所示: function functionName(parameter1, parameter2…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部