平衡树启发式合并的时间复杂度证明
例题:AcWing.1063 永无乡
\(n\) 为合并成的树的大小。
\[T(n)=\max_{0 \leq m \leq n/2} \{T(m)+T(n-m)+mlog(n-m)\}
\]
发现这样不好证。
于是我们可以单独对每一个结点统计贡献。
刚开始有 \(n\) 个结点,每个结点自成一棵树(即所在树的大小为 \(1\)).
对于每个结点 u ,若其所在树合并一次,并且 u 所在树是较小的。
那么 u 所在树至少增大一倍,所以 u 至多合并 \(log_{2}n\) 次。
把一次合并的复杂度平摊到 小的树中每个节点上,那么 每个结点一次合并将有 \(log_{2}n\) 的复杂度。
综上 每个结点:
- 至多合并 \(log_{2}n\) 次.
- 一次合并摊上 \(log_{2}n\) 的复杂度,
- 共有 n 个结点
故总的复杂度为 \(O(nlog^{2}n).\)
map
,set
,priority_queue
的启发式合并复杂度同理可证。
推荐阅读