平衡树启发式合并的时间复杂度证明

例题: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 的启发式合并复杂度同理可证。

推荐阅读

posted @ 2020-12-02 16:04  cjlworld  阅读(451)  评论(0编辑  收藏  举报