再谈线段树合并:复杂度

先前在介绍线段树合并的这篇文章中,有提到:

\(n\) 为元素个数,\(V\) 为值域,合并过程中总共会合并(或者说插入) \(O(n)\) 个点,单次操作复杂度为 \(O(\log V)\),故这样操作合并若干个线段树的总复杂度为 \(O(n \log V)\)

然而现在我发现这段话连我自己看完后都满脸问号,所以要来写一段至少让自己能完全理解的复杂度分析(虽然请教了 Deepseek)。

\(n\) 为元素个数,\(V\) 为值域,那么一个元素贡献 \(O(\log V)\) 个结点,初始时所有线段树的点数和为 \(O(n\log V)\)。由于合并时我们只会在两棵线段树都有的结点上继续往下递归,且对于这类重叠的结点,合二为一之后可视为删去了一个点,所以最终至多遍历/删去 \(O(n\log V)\) 个点,复杂度自然是 \(O(n\log V)\)

空间复杂度可以类似地进行分析,合并过程中不会新开结点,于是最终线段树所拥有的结点为所有小线段树结点的并,个数即为 \(O(n\log V)\)

posted @ 2026-04-27 19:54  yutar  阅读(22)  评论(0)    收藏  举报