线段树、字典树和并查集
Segment Tree 线段树
- 线段树也称区间树。字典树是多叉树,也称为前缀树。并查集是一种树型的数据结构。
- 线段树就是对于一棵
二叉树
,每一个节点其实存储的是每一个线段
或者是一个区间
相应的信息
。 - 线段树
不是
完全二叉树,线段树是平衡二叉树,堆也是平衡二叉树。
完全二叉树
本身
就是平衡二叉树。平衡二叉树
概念: 对于整棵树来说,最大
的深度和最小
的深度他们之间的差最多
只有可能为1
。
- 经典的线段树问题:
区间染色
、区间查询
。用数组
来实现这两个问题的话,更新和查询都是O(n)
,而线段树
则是O(log n)
。 - 区间有 n 个元素,用数组表示的话需要
4n
的空间来存储。
0层:1
1层:2
2层:4 对于满二叉树:
3层:8 h层,一共有2^h-1节点(大约是2^h)
... 最后一层(h-1层),有2^(h-1)个节点
h-1层:2^(h-1) 最后一层的节点数大致等于前面所有层节点之和
如果n=2^k(满二叉树) 只需要2n的空间
最坏的情况,如果n=2^k+1 需要4n的空间
Trie 字典树
- 字典树是一种
有序树
,用于保存关联数组
,其中的键通常是字符串
。 - 字典树与
二叉查找树
不同,键
不是直接保存在节点中,而是由节点在树中的位置
决定。 - 一个节点的所有子孙都有
相同
的前缀,也就是这个节点对应的字符串,而根节点对应空字符串
。一般情况下,不是所有
的节点都有对应的值,只有叶子节点
和部分内部节点
所对应的键才有相关的值。 - trie 树常用于
搜索提示
。如当输入一个网址,可以自动搜索
出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似
的可能。
UnionFind 并查集
- 在计算机科学中,并查集是一种
树型
的数据结构,用于处理一些不交集
(Disjoint Sets)的合并及查询
问题。 - 对一组数据,主要支持
两个动作
:
- Union(p, q):将两个子集
合并成
同一个集合。 - isConnected(p, q):查询给定两个元素他们是否属于同一个集合。它可以被用来确定两个元素是否属于同一子集。