当前位置:首页 > 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实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…