哈希表理论基础

  • 用来快速判断某个原生是否在集合内(快速查找)
  • 哈希函数将传入的key映射到符号表的索引上
  • 哈希冲突解决多个key映射到符号表相同索引上的问题,常用的解决办法有拉链法和线性探测法
  • c++ stl中有四种常见的哈希结构
  • 数组 std::array
  • 集合 std::set std::multiset std::unordered_set
  • 映射 std::map std::multimap std::unordered_map

「虽然看起来map是万能的,但也要知道什么时候用数组,什么时候用set」

集合底层实现是否有序增删查的效率
std::setRB-TreeO(logn)
std::multisetRB-TreeO(logn)
std::unordered_setHashO(1)
std::unordered_multisetHashO(1)
映射底层实现是否有序增删查的效率
std::mapRB-TreeO(logn)
std::multimapRB-TreeO(logn)
std::unordered_mapHashO(1)
std::unordered_multimapHashO(1)

数组作为hash 表 - 表长固定且密集

242 - 有效的字母异位词

383 - 赎金信

set作为hash表 - 只要key不要value

349 - 两个数组的交集

202 - 快乐数

map作为哈希表

  • 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set是一个集合,里面放的元素只能是一个key

1 - 两数之和

454 - 四数相加II

用hash可以解决,但是效率低且复杂 - 双指针

15 - 三数之和

18 - 四数之和


ysysys
10 声望1 粉丝