当前位置:首页 > 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;
  }
}

定义哈希函数

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

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

插入键值对

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

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

删除键值对

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

js实现hashtable

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实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js手势实现

js手势实现

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

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…