一、集合
定义
数学中默认指无序集,用于表达元素的聚合关系。两个元素只有属于同一个集合与不属于同一集合两种关系。
常见实现方式
std::unordered_set、std::unordered_map
并查集、哈希表
启发式可并堆
二、并查集
定义
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。
优化
按秩合并
在执行合并操作时,将更小的树连接到更大的树上,这样的优化方式就称为“按秩合并”
路径压缩
在执行查找的过程中,扁平化树的结构,这样的优化方式称为“路径压缩“
在并查集中同时使用上面的这两种优化方法,会将查找与合并的平均时间复杂度降低到常数水平(渐进最优算法)。
三、Hash表
定义
“散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
类型
字符串哈希:任意两个字符串两两比较时间上必然是不可取的,时间复杂度。时间只允许处理每一个字符串仅一次。
哈希函数
Hash 冲突
定义
模运算可以将数值折叠到一个小区间内。 但折叠之后,不同的数可能映射到同一个区域, 这一现象称为 Hash 冲突。
解决方法 1. 使用稳健的 Hash 函数,效率最高,冲突率最高 2. 使用十字链表,完全解决冲突,效率较低 3. 使用 Multi-Hash,折中的方法
四、STL中的集合
STl中有集合的实现,分为有序集与偏序集。其中分为集合(set)与映射(map)。
无序集在 STL 中是 unordered_set 和 unordered_map。
其本质为 Hash表,因此增删改查均为 O(1)。
对于复杂数据类型,需要手动实现 Hash函数。
偏序集在 STL 中是 set 和 map。
本质为排序树,增删改查均为 O(logn)。
对于复杂数据类型,需要手动实现偏序关系,即<运算符。
集合在 STL 中有两种,分别是 有序集合 和 无序集合,分别需要的头文件为 < unordered_set > 和 < set >,二者功能上类似,但有序集可找前驱后继。
映射在 STL 中也有两种,分别是 有序映射 和 无序映射,分别需要的头文件 为< unordered_map > 需头文件 < map >