详解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日

相关文章

  • 编程语言JavaScript简介

    编程语言JavaScript简介 JavaScript的概述 JavaScript是一种Web前端开发中经常用到的编程语言,也是一种具有广泛应用的脚本语言。它可以与HTML和CSS合作,用于构建交互式的网站和Web应用程序,也可以在后端服务器上运行。 JavaScript最初由网景公司(Netscape)的 Brendan Eich 开发,于1995年发布,…

    JavaScript 2023年5月18日
    00
  • javascript中数组的常用算法深入分析

    当我们学习JavaScript编程语言的时候,数组(Array)是一种非常常见和重要的数据结构。数组是一种基本的JavaScript数据类型,它是用来存储一组数据的容器。在日常开发中,我们常常需要对数组进行各种操作。本文将详细介绍JavaScript中数组的常用算法,并分析其实现原理。 数组的常用方法 下面是常用的数组处理方法: 1. 数组去重 functi…

    JavaScript 2023年5月27日
    00
  • JS判断字符串长度的5个方法(区分中文和英文)

    这里是详细讲解“JS判断字符串长度的5个方法(区分中文和英文)”的完整攻略。 什么是字符串长度 在JavaScript编程中,字符串长度指的是字符串中包含的字符数。在英文环境中,一个字符通常只占用一个字节的空间,而在中文环境中,一个字符可能需要占用多个字节的空间。因此,在处理字符串时,需要特别注意字符长度的计算问题。 判断字符串长度的方法 下面介绍5种常用的…

    JavaScript 2023年5月19日
    00
  • 详解Javascript动态操作CSS

    详解Javascript动态操作CSS 概述 在网页中,CSS是控制网页样式的重要手段之一,而通过Javascript动态修改CSS,可以实现更加灵活的交互效果。本攻略将介绍如何通过Javascript来动态修改CSS。 获取元素 首先,需要获取到需要修改CSS的元素。可以通过document.getElementById、document.getEleme…

    JavaScript 2023年6月10日
    00
  • JavaScript 浏览器兼容性总结及常用浏览器兼容性分析

    JavaScript 浏览器兼容性总结及常用浏览器兼容性分析 什么是浏览器兼容性? 浏览器兼容性指的是不同的浏览器(如 Chrome、Safari、Firefox、Edge 等)在对同一段代码的解释和运行方式上存在差异的情况。 由于各个浏览器采取的内核和标准不同,所以同一段 JavaScript 代码在不同的浏览器上的表现可能完全不同。因此,在开发网站或应用…

    JavaScript 2023年6月10日
    00
  • js实现横向百叶窗效果网页切换动画效果的方法

    实现横向百叶窗效果网页切换动画效果,可以通过以下步骤来进行: 准备工作 准备HTML结构,结构中至少包含两个需要进行切换的元素。 <div class="container"> <div class="panel">内容1</div> <div class="pane…

    JavaScript 2023年6月11日
    00
  • js中键盘事件实例简析

    js中键盘事件实例简析 键盘事件是Web开发中十分常用的事件之一,掌握了它的使用方法可以大大提高效率和用户体验。这篇文章将从以下两个方面介绍js中键盘事件的相关知识:键盘事件类型和键盘事件的应用 键盘事件类型 onKeyDown 键盘按下触发。按住不放会不断触发该事件。 onKeyPress 键盘按下并放开后触发。 onKeyUp 键盘放开后触发。和按下事件…

    JavaScript 2023年6月11日
    00
  • javascript 出生日期和身份证判断大全

    Javascript 出生日期和身份证判断大全 简介 本文主要讲解了如何使用Javascript判断身份证号和出生日期是否符合标准。 身份证号判断 校验规则 中国大陆的身份证号码是由18位数字组成的。最后一位为校验位,前17位为身份证号码的主体部分。其中,第1-2位为行政区划代码,第3-6位为出生年份(用4位数字表示),第7-10位为出生月份和日期(用2位数…

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