当前位置:首页 > JavaScript

js实现hashtable

2026-03-15 03:37:32JavaScript

JavaScript 实现哈希表的方法

使用对象(Object)实现哈希表

JavaScript 的对象({})本质上是一个键值对集合,可以直接用作哈希表。键必须是字符串或 Symbol 类型。

js实现hashtable

const hashTable = {};

// 添加键值对
hashTable["key1"] = "value1";
hashTable["key2"] = "value2";

// 获取值
console.log(hashTable["key1"]); // 输出: "value1"

// 删除键值对
delete hashTable["key1"];

使用 Map 实现哈希表

ES6 引入的 Map 对象更适合作为哈希表,因为它支持任意类型的键(包括对象),并且保留了插入顺序。

js实现hashtable

const hashMap = new Map();

// 添加键值对
hashMap.set("key1", "value1");
hashMap.set("key2", "value2");

// 获取值
console.log(hashMap.get("key1")); // 输出: "value1"

// 删除键值对
hashMap.delete("key1");

// 检查键是否存在
console.log(hashMap.has("key2")); // 输出: true

自定义哈希表实现

如果需要完全控制哈希表的行为(如哈希函数、冲突处理等),可以手动实现一个哈希表类。

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

  // 哈希函数
  hash(key) {
    let hashValue = 0;
    for (let i = 0; i < key.length; i++) {
      hashValue += key.charCodeAt(i);
    }
    return hashValue % this.size;
  }

  // 添加键值对
  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];
    const entryIndex = bucket.findIndex(entry => entry.key === key);

    if (entryIndex !== -1) {
      bucket.splice(entryIndex, 1);
      return true;
    }
    return false;
  }
}

// 使用示例
const table = new HashTable();
table.set("name", "Alice");
console.log(table.get("name")); // 输出: "Alice"
table.delete("name");

哈希冲突处理

哈希冲突是多个键映射到同一个桶的情况。常见的冲突处理方法包括链地址法(如上述自定义实现)和开放寻址法。

性能优化

  • 动态扩容:当哈希表的负载因子(元素数量 / 桶数量)超过阈值时,可以扩容以减少冲突。
  • 更好的哈希函数:减少冲突的概率,如使用加密哈希函数(如 SHA-1,但性能较低)或更均匀的分布函数。

注意事项

  • 对象({})的键只能是字符串或 Symbol,而 Map 支持任意类型。
  • 自定义哈希表需要处理哈希冲突和性能问题。
  • Map 是标准化的哈希表实现,推荐优先使用。

标签: jshashtable
分享给朋友:

相关文章

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…