数据结构基础(三)

一、集合

  1. 定义

数学中默认指无序集,用于表达元素的聚合关系。两个元素只有属于同一个集合与不属于同一集合两种关系。

  1. 常见实现方式

  • std::unordered_set、std::unordered_map

  • 并查集、哈希表

  • 启发式可并堆

二、并查集

  1. 定义

并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。

  1. 优化

  • 按秩合并

在执行合并操作时,将更小的树连接到更大的树上,这样的优化方式就称为“按秩合并”

  • 路径压缩

在执行查找的过程中,扁平化树的结构,这样的优化方式称为“路径压缩“

在并查集中同时使用上面的这两种优化方法,会将查找与合并的平均时间复杂度降低到常数水平(渐进最优算法)。

三、Hash表

  1. 定义

“散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

  1. 类型

  • 字符串哈希:任意两个字符串两两比较时间上必然是不可取的,时间复杂度。时间只允许处理每一个字符串仅一次。

  • 哈希函数

  1. 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 >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值