关于线段树合并的复杂度证明

因为感觉网上的都怪怪的,所以自己yy了一下。。

假设树上点数是O(n)O(n),每个点上有一些权值。每个点的权值个数之和是O(m)O(m),线段树是对权值建的。

考虑一个线段树上的区间[l,r][l,r]
在合并的时候,只有当两个线段树在这个区间内都有点,这个区间才会贡献 1 的复杂度。
而考虑这个区间内的权值在原树上的分布,假设原树上共有kk个点含有这个区间内的权值,容易发现最多有k1k-1次合并在两棵线段树会同时存在这个区间内的权值。(因为是树形合并)。那么这个区间总共会贡献O(k)O(k)的复杂度。

然后考虑在线段树中同一层的所有区间,它们对复杂度的贡献是
O()O(\sum_{某个区间} 树上包含这个区间内的权值的点数)
O()=O(m)\le O(\sum_{某个权值}树上包含这个权值的点数)=O(m)

而线段树总共有logm\log m层,所以复杂度是小于O(mlogm)O(m\log m)的。

而在一般的问题中,每个点通常只包含一个权值并且互不相同(m=nm=n),所以O()=O()=O(n)O(\sum_{某个区间}树上包含这个区间内的权值的点数)=O(\sum_{某个区间}区间大小)=O(n),于是复杂度为O(nlogn)O(n\log n)

由此也可以见得,如果每个点都有O(n)O(n)个权值,那么复杂度将会是O(n2+n22+n24+n2n)=O(n2)O(n^2+\frac {n^2}2+\frac {n^2}4+\frac {n^2}n)=O(n^2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章