面试数据结构:哈希表

哈希表通过哈希函数把 key 映射到桶。

C++ 容器

std::unordered_map<std::string, int> count;
std::unordered_set<int> seen;

平均情况下,插入、查找、删除接近 O(1)

常见题型

注意

哈希表不是有序结构。如果需要顺序,考虑 std::map 或排序。

两数之和为什么用哈希表

暴力做法要枚举两个数,复杂度是 O(n^2)。哈希表的做法是边遍历边记录已经见过的值:

for (int i = 0; i < nums.size(); ++i) {
    int need = target - nums[i];
    if (pos.contains(need)) return {pos[need], i};
    pos[nums[i]] = i;
}

它把“找另一个数”的过程从线性扫描变成哈希查找。

前缀和 + 哈希表

很多子数组问题都可以转成前缀和问题。比如寻找和为 k 的子数组数量,可以统计之前出现过多少次 prefix - k

这类题的关键是把“连续区间”转成“两个前缀和的差”。

工程注意

哈希表平均复杂度很好,但最坏情况并不总是 O(1)。工程里如果 key 很复杂,要关注哈希函数质量和内存占用。

评论

...

正在读取评论。