详解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中的undefined和not defined区别示例介绍

    下面是“javascript中的undefined和not defined区别示例介绍”的详细攻略: 1. 什么是undefined和not defined 在javascript中,undefined和not defined是两个非常常见的概念,不过千万不要把它们混淆。 当JavaScript中使用一个还未被声明的变量时,JavaScript会抛出一个“未…

    JavaScript 2023年5月18日
    00
  • javascript题目,重写函数让其无限相加

    当我们看到“重写函数让其无限相加”这个题目时,第一时间想到的就是递归。递归是指函数直接或间接地调用自身。使用递归可以很方便地实现一个无限相加的函数。 下面是一个实现步骤的完整攻略: 1. 定义函数 首先,我们需要定义一个函数,函数名为add,参数为无限个数字,返回值为一个函数。 function add() { let args = Array.protot…

    JavaScript 2023年6月11日
    00
  • Jquery响应回车键直接提交表单操作代码

    以下是关于Jquery响应回车键直接提交表单操作代码的完整攻略。 1. 实现方法 Jquery可以监听键盘事件,并且可以获取当前输入框的值,从而判断是否需要执行相应操作。 常用的键盘事件有keydown和keyup,分别代表按下和抬起键的时候触发。 代码实现如下: $(document).ready(function(){ //监听按键事件 $(‘input…

    JavaScript 2023年6月10日
    00
  • 使用JavaScript获取电池状态的方法

    获取电池状态是Web开发中比较常见的需求之一,可以通过JavaScript获取电池状态,从而更好地帮助用户管理电池电量。 示例一:使用Battery API获取电池状态 在现代浏览器中,我们可以通过使用Battery API获取电池状态。首先,需要检测浏览器是否支持Battery API: if (‘getBattery’ in navigator) { /…

    JavaScript 2023年6月11日
    00
  • 获取input标签的所有属性的方法

    获取input标签的所有属性的方法可以基于JavaScript实现。主要流程包括获取input标签、获取input标签的所有属性以及遍历输出所有属性。具体步骤如下: 步骤 第一步:获取input标签 首先,我们需要获取input标签元素。可以通过document.querySelector(selector)获取: const inputElement = …

    JavaScript 2023年6月11日
    00
  • javascript计算用户打开网页的停留时间

    要计算用户在网页的停留时间,最常用的方法是使用JavaScript。下面是一个完整的攻略: 步骤1:获取网页打开时间 用JavaScript获取网页打开的时间是很简单的。可以使用Date对象来获取当前时间,并将其存储在一个变量中。以下是一个示例代码块: var startTime = new Date().getTime(); 步骤2:获取用户离开网页的时间…

    JavaScript 2023年6月11日
    00
  • JavaScript使用Fetch的方法详解

    首先让我们来讲解一下“JavaScript使用Fetch的方法详解”的完整攻略。 JavaScript使用Fetch的方法详解 什么是Fetch? Fetch 是一种基于 Promise 实现的异步网络请求 API。它提供了更加简单、更加强大的请求方式,比传统的 XmlHttpRequest 对象更加友好和易用。 基本使用方法 Fetch 的使用非常简单,一…

    JavaScript 2023年5月27日
    00
  • javascript自定义加载loading效果

    下面我将详细讲解“JavaScript自定义加载loading效果”的完整攻略,主要分为以下几个部分: 一、理解loading效果 1.1 什么是loading效果 loading效果是指在页面或某个模块正在进行加载操作时,为了提高用户体验而展示的一种动态效果。 1.2 loading效果的重要性 loading效果是提升用户体验的关键环节。当用户在浏览网页…

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