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

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值