当前位置:首页 > 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(() => []);
  }
}

哈希函数设计

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

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

处理键值对插入

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

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;
}

删除键值对

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

js 实现hashtable

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
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现文件下载

js实现文件下载

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

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…