当前位置:首页 > JavaScript

js实现hashtable

2026-04-06 21:13:42JavaScript

实现哈希表的基本结构

哈希表(Hash Table)通过键值对存储数据,利用哈希函数将键映射到特定索引。JavaScript 中可通过对象或 Map 实现,但手动实现能更深入理解原理。

class HashTable {
  constructor(size = 32) {
    this.buckets = new Array(size);
    this.size = size;
  }
}

定义哈希函数

哈希函数将键转换为索引。简单实现可采用字符编码求和后取模。

js实现hashtable

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

处理冲突的方法

冲突发生时(不同键映射到同一索引),常用链地址法(数组+链表)或开放寻址法。以下采用链地址法:

class HashNode {
  constructor(key, value) {
    this.key = key;
    this.value = value;
    this.next = null;
  }
}

插入键值对

检查索引位置是否存在节点,若无则直接插入,否则遍历链表更新或追加节点。

js实现hashtable

set(key, value) {
  const index = this._hash(key);
  if (!this.buckets[index]) {
    this.buckets[index] = new HashNode(key, value);
  } else {
    let currentNode = this.buckets[index];
    while (currentNode) {
      if (currentNode.key === key) {
        currentNode.value = value; // 更新现有键
        return;
      }
      if (!currentNode.next) break;
      currentNode = currentNode.next;
    }
    currentNode.next = new HashNode(key, value); // 追加新节点
  }
}

获取键对应的值

根据哈希找到索引,遍历链表查找匹配的键。

get(key) {
  const index = this._hash(key);
  let currentNode = this.buckets[index];
  while (currentNode) {
    if (currentNode.key === key) {
      return currentNode.value;
    }
    currentNode = currentNode.next;
  }
  return undefined;
}

删除键值对

找到节点后,如果是链表头则直接替换,否则调整前驱节点的指针。

delete(key) {
  const index = this._hash(key);
  let currentNode = this.buckets[index];
  let prevNode = null;
  while (currentNode) {
    if (currentNode.key === key) {
      if (!prevNode) {
        this.buckets[index] = currentNode.next; // 删除头节点
      } else {
        prevNode.next = currentNode.next; // 删除中间节点
      }
      return true;
    }
    prevNode = currentNode;
    currentNode = currentNode.next;
  }
  return false;
}

完整示例代码

class HashNode {
  constructor(key, value) {
    this.key = key;
    this.value = value;
    this.next = null;
  }
}

class HashTable {
  constructor(size = 32) {
    this.buckets = new Array(size);
    this.size = size;
  }

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

  set(key, value) {
    const index = this._hash(key);
    if (!this.buckets[index]) {
      this.buckets[index] = new HashNode(key, value);
    } else {
      let currentNode = this.buckets[index];
      while (currentNode) {
        if (currentNode.key === key) {
          currentNode.value = value;
          return;
        }
        if (!currentNode.next) break;
        currentNode = currentNode.next;
      }
      currentNode.next = new HashNode(key, value);
    }
  }

  get(key) {
    const index = this._hash(key);
    let currentNode = this.buckets[index];
    while (currentNode) {
      if (currentNode.key === key) {
        return currentNode.value;
      }
      currentNode = currentNode.next;
    }
    return undefined;
  }

  delete(key) {
    const index = this._hash(key);
    let currentNode = this.buckets[index];
    let prevNode = null;
    while (currentNode) {
      if (currentNode.key === key) {
        if (!prevNode) {
          this.buckets[index] = currentNode.next;
        } else {
          prevNode.next = currentNode.next;
        }
        return true;
      }
      prevNode = currentNode;
      currentNode = currentNode.next;
    }
    return false;
  }
}

使用示例

const table = new HashTable();
table.set('name', 'Alice');
table.set('age', 25);
console.log(table.get('name')); // 输出: Alice
table.delete('age');
console.log(table.get('age')); // 输出: undefined

标签: jshashtable
分享给朋友:

相关文章

js轮播图实现原理

js轮播图实现原理

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

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现同步

js实现同步

同步与异步的概念 在JavaScript中,同步代码会按照顺序执行,每一行代码必须等待上一行代码执行完成后才能运行。异步代码则允许在等待某些操作(如网络请求)完成的同时继续执行其他代码。 实现同步的…

js实现刷新

js实现刷新

刷新当前页面 使用 location.reload() 方法可以强制刷新当前页面。该方法接受一个布尔参数,默认为 false,表示从缓存中加载页面;设为 true 时强制从服务器重新加载。 // 从…