学习心得
一、并查集
- 功能:在近乎O(1)的时间复杂度内完成:
将两个集合合并;
询问两个元素是否在一个集合中。 - 基本原理:
每一个集合用树(不一定是二叉树)表示。
根节点编号为集合编号。
每个结点x存储父结点p[x]。 - 基本操作:
if (p[x] == x) //判断树根
while (p[x] != x) x=p[x]; //求x的集合编号
p[x]=y //合并两个集合
(p[x] - 集合x编号,p[y] - 集合y编号) - 优化:
搜过后直接把路径上所有结点直接指向根节点。 - 核心:
int find(int x){ // 返回x的祖宗节点
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
二、堆
- 特点:
实现删除修改任意元素(STL无法直接实现)
用于Dijkstra算法 - 操作:
插入一个数
求集合中最小值
删除最小值
删除任意元素
修改任意元素 - 基本结构:
完全二叉树 - 存储:
一维数组 - 建堆:
for (int i = n/2 ;i ;i --) down(i);
时间复杂度:O(n)
三、字典树(Ttie树)
- 功能:
快速高效存储和查找字符串集合。 - 构造:
字符串中从前向后查找每一位是否是树的结点,不是则创建。
每个串结尾打标记。 - 特点:
题目中一定限制了字母种类,最多52+10数字;
种类特别多(例如汉字)时,用二进制位存。
1.7小结
- 《算法基础课》
- AcWing 4题(835 - 837, 240)