哈希表提供 O(1) 的查找效率,是前端开发中最常用的数据结构之一。

哈希表 (Hash Table)

哈希表是一种通过哈希函数将键映射到值的数据结构,提供近乎 O(1) 的查找、插入和删除操作。

// JavaScript 中的哈希表实现

// ES6 Map - 任意类型作为键
const map = new Map();
map.set('key', 'value');
map.get('key');    // 'value'
map.has('key');    // true
map.delete('key');

// ES6 Set - 存储唯一值
const set = new Set([1, 2, 2, 3]);
// Set { 1, 2, 3 }

// 普通对象(字符串键)
const obj = { key: 'value' };

时间复杂度:

  • 查找 (get): 平均 O(1),最坏 O(n)
  • 插入 (set): 平均 O(1),最坏 O(n)
  • 删除 (delete): 平均 O(1),最坏 O(n)

示例 1: 哈希表基本操作

键 (Key)
值 (Value)
操作
name
张三
age
25
city
北京

大小: 3

示例 2: 两数之和(LeetCode 1)

给定数组和目标值,找出数组中和为目标值的两个数的索引。 使用哈希表可以将时间复杂度从 O(n²) 降到 O(n)。

数组:[2, 7, 11, 15]
目标:
数组:
2[0]
7[1]
11[2]
15[3]
function twoSum(nums, target) {
  const map = new Map();

  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];

    if (map.has(complement)) {
      return [map.get(complement), i];
    }

    map.set(nums[i], i);
  }

  return [];
}

示例 3: 字符频率统计

使用哈希表统计字符串中每个字符出现的次数。

function charFrequency(str) {
  const freq = new Map();

  for (const char of str) {
    freq.set(char, (freq.get(char) || 0) + 1);
  }

  return freq;
}

示例 4: Map 和 Set 对比

Set(集合)

存储唯一值的集合

1 ×2 ×3 ×

大小: 3

has(2): true

Map(映射)

存储键值对的集合

a: 1 ×b: 2 ×

大小: 2

get("a"): 1

Set 用途:
  • 数组去重
  • 判断元素是否存在
  • 集合运算(交集、并集)
Map 用途:
  • 缓存数据
  • 计数统计
  • 任意类型作为键