基本原理
- 哈希函数
- 用于计算键的哈希值,将其映射到哈希表的索引
- 哈希表
- 利用哈希函数将键值对映射到数组索引,实现高效的数据存取
- 适用场合
- 用来快速判断一个元素是否出现集合里
- 适用于需要快速查找和更新操作的场景,如缓存、字典、数据库索引等
哈希冲突
- 多个键计算出相同的哈希值导致的存储冲突。
- 解决方法
- 链地址法:使用链表存储相同哈希值的所有键值对
- 开放地址法
- 线性探测:从冲突位置开始,线性查找下一个空桶。
- 二次探测:使用探测次数的平方来调整探测位置。
- 双重散列:使用第二个哈希函数计算探测步长。
哈希性能分析
负载因子与扩展策略
实现哈希的数据结构
set, map的构造方法
unordered_set, unordered_map的构造方法
二叉树
-
满二叉树
- 每个节点要么有 0 个要么有 2 个子节点。
-
完全二叉树
- 除了最底层节点,其余每层节点数都达到最大值,且最后一层节点尽可能从左到右填满干位置。
-
二叉搜索树
- 左子树 < 节点 < 右子树,中序遍历能得到有序序列
- 应用:高效查找、插入、删除
-
平衡二叉树
- 左右子树高度差不超过某个值的二叉搜索树,如 AVL 树、红黑树
-
红黑树
- 通过颜色和旋转保持平衡,每个节点有红色或黑色标记
- 根节点和叶子节点为黑色、红节点的两个子节点全黑、路径上黑节点数相同
- 查找/插入/删除效率:O(log n),插入和删除通过旋转和颜色调整维持平衡。
- 应用:
std::map
、std::set
实现
-
平衡二叉搜索树(AVL树)
- 左右子树高度差最多为 1
- 查找/插入/删除效率:O(log n),插入和删除需要旋转
- 应用:需要严格平衡的查找
算法题型