详解JavaScript实现哈希表

详解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支付页面倒计时的实现示例

    下面是“JS支付页面倒计时的实现示例”的完整攻略。 确定倒计时截止时间 在进行倒计时实现前,需要确定倒计时的时间截止点。假设我们的支付页面需要在用户提交订单30分钟后自动关闭,则倒计时截止时间应设置为30分钟之后的时间点。 在JavaScript中,可以使用Date对象来获取当前时间,并通过setMinutes和setSeconds方法来设置倒计时截止时间。…

    JavaScript 2023年6月11日
    00
  • js完全解析url和拼接

    当我们在编写JavaScript代码时,有时候需要操作URL来完成一些特定的需求,比如向服务器发送请求、获取参数以及跳转到其他页面等。本文将为您详细讲解如何完全解析和拼接URL,以便于您在开发中更加轻松地完成URL相关的操作。 解析完整URL 我们先来看一下如何解析一个完整的URL,这个过程中要获取的部分包括协议、主机、端口、路径、查询参数以及哈希值。我们可…

    JavaScript 2023年6月11日
    00
  • 如何提示用户打开Cookie?

    下面我就来详细讲解如何提示用户打开Cookie。 如何提示用户打开Cookie 在网站开发过程中,我们有时需要使用Cookie来存储用户信息、记住用户的偏好设置等等,但是有些用户的浏览器可能默认禁用了Cookie,这就需要我们提示用户打开Cookie,这些提示可以包括以下几个步骤: 步骤一:检测Cookie是否被禁用 我们可以使用JavaScript判断浏览…

    JavaScript 2023年6月11日
    00
  • JS 中使用Promise 实现红绿灯实例代码(demo)

    下面是使用 Promise 实现红绿灯实例代码的攻略。 红绿灯实例代码 在使用 Promise 实现红绿灯实例代码之前,我们需要了解什么是红绿灯实例代码。红绿灯实例代码是一种模拟红绿灯闪烁的代码,通常用于展示 Promise 的作用。 以下是基于 Promise 实现红绿灯实例代码的完整攻略: 1. 创建 Promise 对象 在开始使用 Promise 实…

    JavaScript 2023年6月10日
    00
  • JS验证日期的格式YYYY-mm-dd 具体实现

    JS验证日期的格式可以使用正则表达式来完成。代码实现如下: // 定义正则表达式 var reg = /^(\d{4})-(\d{2})-(\d{2})$/; // 验证日期格式 function verifyDate(dateStr) { if (reg.test(dateStr)) { return true; } else { return false…

    JavaScript 2023年5月27日
    00
  • WinForm使用正则表达式提取内容的方法示例

    WinForm使用正则表达式提取内容的方法示例 什么是正则表达式 正则表达式(Regular Expression),是一种文本模式,用来匹配、替换一些文本。 WinForm中正则表达式的使用 在WinForm中,我们可以通过使用System.Text.RegularExpressions命名空间提供的正则表达式类进行文本的匹配和替换。 使用步骤如下: 引用…

    JavaScript 2023年6月10日
    00
  • Javascript 是你的高阶函数(高级应用)

    Javascript 是你的高阶函数(高级应用) 在Javascript中,函数是一等公民,这意味着函数可以像变量一样被存储、传递和操作。高阶函数是基于这个概念,是指可以接受函数作为参数并/或返回函数的函数。 传递函数作为参数 以下是一个例子,演示如何将函数作为参数传递: function greet(name, callback) { console.lo…

    JavaScript 2023年5月27日
    00
  • JavaScript生成带有缩进的表格代码

    当我们需要在网页上展示表格数据时,生成带有缩进的表格代码可以使代码结构更加清晰、易于阅读。下面是生成带有缩进的表格代码的步骤: 1. 准备数据 首先需要准备数据,可以是从后台服务器获取到的数据,也可以是通过JS数组手动创建的数据。例如,下面是一个JS数组: // 示例数据 var data = [ { name: ‘张三’, age: 28, address…

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