并查集
定义:并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。
并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。
操作:
合并:把两个不相交的集合合并为一个集合。
查询:查询两个元素是否在同一个集合中。
例题:
P1551 亲戚
//初始化
void init(int n) {
for(int i = 1; i <= n; i++) p[i] = i;
}
//查找
int search(int i) {
return i == p[i] ? i : (lookup(p[i]));
}
//合并
void merge(int i, int j) {
p[lookup(i)] = lookup(j);
}
为了更快找到根节点,可以对补充剂进行路径压缩
路径压缩:对于一个集合树来说,它的根节点下面可以依附着许多的节点,因此,我们可以尝试在 find 的过程中,从底向上,如果此时访问的节点不是根节点的话,那么我们可以把这个节点尽量的往上挪一挪,减少数的层数
菜鸟这里写的挺清楚的:并查集路径压缩
如下图中,find(4) 的过程就可以路径压缩,让数的层数更少。
节点 4 往上寻找根节点时,压缩第一步,树的层数就减少了一层:
节点 2 向上寻找,也不是根节点,那么把元素 2 指向原来父节点的父节点,操后后树的层数相应减少了一层,同时返回根节点 0。
Hash表
定义:
即散列表,是根据关键码值(Key value)而直接进行访问的数据结构。
Key value 称为键值对。
计算机数据查找过程中数据元素的存储位置与关键码之间不存在确定的关系,查找算法是建立在比较的基础上,查找效率受比较次数的影响,理想方法是让关键字值与存储位置建立关系,通过关系运算确定其元素是否存在。这种关系可以采用哈希技术来来实现。“哈希”是一种存储方式,又是一种查找方法。这种对应得查找方法称为哈希查找。
例题:
P3370 【模板】字符串哈希
本人能力不足,怎么写都是70,目前不知道哪出问题,就不丢丑了。后续看看吧。人已经麻了!!!
STL之集合
set
定义:
set 为集合,是一个内部自动有序且不含重复元素的容器。set 最主要的作用就是自动去重并按升序排序,因此遇到需要去重但是又不方便直接开数组的情况,set 中的元素是唯一的。
使用 set 前,必须先添加 set 头文件,即 #include ,同时,必须要有“using namespacestd”。
常用方法:
begin()——返回set容器的第一个元素
end()——返回set容器的最后一个 元素
clear()——删除set容器中的所有的元素
empty()——判断set是否为空,返回类型为布尔
max_size()——返回set可能包含的元素最大个数
size()——返回当前set容器中的元素个数
rbegin()——返回的值和end()相同
rend()——返回的值和rbegin()相同
map
定义:
map 提供的是一种键值对容器,里面的数据都是成对出现的:每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次;第二个称之为该关键字的对应值。
用法:
#include <map> // STL头文件没有扩展名.h
//map 对象是一个模版类,需要关键字和存储对象两个模版参数
std::map<int , std::string> person;
begin() //返回指向 map 头部的迭代器
clear() //删除所有元素
count() //返回指定元素出现的次数
empty() // 如果 map 为空则返回 true
end() //返回指向 map 末尾的迭代器
equal_range() //返回特殊条目的迭代器对
erase() //删除一个元素
find() //查找一个元素
get_allocator() //返回map的配置器
insert() //插入元素
key_comp() //返回比较元素key的函数
lower_bound() //返回键值>=给定元素的第一个位置
max_size() // 返回可以容纳的最大元素个数
rbegin() //返回一个指向map尾部的逆向迭代器
rend() //返回一个指向map头部的逆向迭代器
size() // 返回map中元素的个数
swap() // 交换两个map
upper_bound() //返回键值>给定元素的第一个位置
value_comp() //返回比较元素value的函数