当前位置:首页 > JavaScript

js 实现hashtable

2026-04-06 23:27:53JavaScript

实现哈希表的基本结构

哈希表(HashTable)是一种通过键(Key)直接访问值(Value)的数据结构,核心在于哈希函数将键映射到存储位置。以下是用 JavaScript 实现哈希表的关键步骤:

class HashTable {
  constructor(size = 32) {
    this.size = size;
    this.buckets = new Array(size).fill(null).map(() => []);
  }
}

哈希函数设计

哈希函数需将任意键转换为固定范围的索引。常用方法是结合字符编码和取模运算:

js 实现hashtable

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash = (hash + key.charCodeAt(i) * i) % this.size;
  }
  return hash;
}

处理键值对插入

使用链地址法解决冲突,将相同哈希值的键值对存储在同一个桶(Bucket)中:

js 实现hashtable

set(key, value) {
  const index = this._hash(key);
  const bucket = this.buckets[index];
  const existingEntry = bucket.find(entry => entry.key === key);

  if (existingEntry) {
    existingEntry.value = value; // 更新现有键
  } else {
    bucket.push({ key, value }); // 新增键值对
  }
}

获取键对应的值

通过哈希定位桶后,遍历桶内元素查找匹配的键:

get(key) {
  const index = this._hash(key);
  const bucket = this.buckets[index];
  const entry = bucket.find(entry => entry.key === key);
  return entry ? entry.value : undefined;
}

删除键值对

从桶中过滤掉指定键的元素:

delete(key) {
  const index = this._hash(key);
  const bucket = this.buckets[index];
  this.buckets[index] = bucket.filter(entry => entry.key !== key);
}

完整代码示例

class HashTable {
  constructor(size = 32) {
    this.size = size;
    this.buckets = new Array(size).fill(null).map(() => []);
  }

  _hash(key) {
    let hash = 0;
    for (let i = 0; i < key.length; i++) {
      hash = (hash + key.charCodeAt(i) * i) % this.size;
    }
    return hash;
  }

  set(key, value) {
    const index = this._hash(key);
    const bucket = this.buckets[index];
    const existingEntry = bucket.find(entry => entry.key === key);
    if (existingEntry) {
      existingEntry.value = value;
    } else {
      bucket.push({ key, value });
    }
  }

  get(key) {
    const index = this._hash(key);
    const bucket = this.buckets[index];
    const entry = bucket.find(entry => entry.key === key);
    return entry ? entry.value : undefined;
  }

  delete(key) {
    const index = this._hash(key);
    const bucket = this.buckets[index];
    this.buckets[index] = bucket.filter(entry => entry.key !== key);
  }
}

性能优化建议

  • 动态扩容:当元素数量超过阈值(如负载因子 > 0.75),倍增桶的数量并重新哈希所有键值对。
  • 更好的哈希函数:可使用加密哈希函数(如SHA-1)的简化版减少冲突。
  • 开放寻址法:作为链地址法的替代方案,直接在数组中寻找空闲位置存储冲突元素。

标签: jshashtable
分享给朋友:

相关文章

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…