Loading docs/ds/dsu.md +3 −1 Original line number Diff line number Diff line author: HeRaNO, JuicyMio, Xeonacid, sailordiary author: HeRaNO, JuicyMio, Xeonacid, sailordiary, ouuan 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 **合并** 及 **查询** 问题。 它支持两种操作: Loading Loading @@ -89,6 +89,8 @@ void unionSet(int x, int y) { 在算法竞赛的实际代码中,即便不使用启发式合并,代码也往往能够在规定时间内完成任务。在 Tarjan 的论文[1]中,证明了不使用启发式合并、只使用路径压缩的最坏时间复杂度是 $\Theta (m \log n)$ 。在姚期智的论文[2]中,证明了不使用启发式合并、只使用路径压缩,在平均情况下,时间复杂度依然是 $\Theta (m\alpha(m,n))$ 。 如果只使用启发式合并,而不使用路径压缩,时间复杂度为 $\Theta(m\log n)$ 。由于路径压缩单次合并可能造成大量修改,有时路径压缩并不适合使用。例如,在可持久化并查集、线段树分治 + 并查集中,一般使用只启发式合并的并查集。 此处给出一种 C++ 的参考实现,其选择深度作为估价函数: ```cpp Loading Loading
docs/ds/dsu.md +3 −1 Original line number Diff line number Diff line author: HeRaNO, JuicyMio, Xeonacid, sailordiary author: HeRaNO, JuicyMio, Xeonacid, sailordiary, ouuan 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 **合并** 及 **查询** 问题。 它支持两种操作: Loading Loading @@ -89,6 +89,8 @@ void unionSet(int x, int y) { 在算法竞赛的实际代码中,即便不使用启发式合并,代码也往往能够在规定时间内完成任务。在 Tarjan 的论文[1]中,证明了不使用启发式合并、只使用路径压缩的最坏时间复杂度是 $\Theta (m \log n)$ 。在姚期智的论文[2]中,证明了不使用启发式合并、只使用路径压缩,在平均情况下,时间复杂度依然是 $\Theta (m\alpha(m,n))$ 。 如果只使用启发式合并,而不使用路径压缩,时间复杂度为 $\Theta(m\log n)$ 。由于路径压缩单次合并可能造成大量修改,有时路径压缩并不适合使用。例如,在可持久化并查集、线段树分治 + 并查集中,一般使用只启发式合并的并查集。 此处给出一种 C++ 的参考实现,其选择深度作为估价函数: ```cpp Loading