一、线段树是平衡二叉树
引理1:根结点区间长度相差1的两棵线段树的高度相差小于等于1
证明:使用数学归纳法
记
h
(
x
)
h(x)
h(x)表示根结点区间长度为x的线段树的高度,即证明:
对任正整数x,都有
h
(
x
+
1
)
−
h
(
x
)
≤
1
h(x+1)-h(x) \leq 1
h(x+1)−h(x)≤1
- 易知 h ( 1 ) = 1 , h ( 2 ) = 2 , h ( 3 ) = 2 h(1)=1,h(2)=2,h(3)=2 h(1)=1,h(2)=2,h(3)=2 。
- 考虑
k
≥
3
k\geq3
k≥3时的情况。已知当
x
<
k
x < k
x<k时,
h
(
x
+
1
)
−
h
(
x
)
≤
1
h(x+1)-h(x) \leq 1
h(x+1)−h(x)≤1,证明当
x
=
k
x=k
x=k时,满足
h
(
k
+
1
)
−
h
(
k
)
≤
1
h(k+1)-h(k)\leq 1
h(k+1)−h(k)≤1
根结点区间长度为k,左孩子区间长度 x l = ⌈ k 2 ⌉ xl =\lceil \frac{k}{2} \rceil xl=⌈2k⌉, 右孩子区间长度 x r = ⌊ k 2 ⌋ xr = \lfloor \frac{k}{2} \rfloor xr=⌊2k⌋,一定有 x l ≥ x r xl \geq xr xl≥xr,因此左子树的高度 h ( x l ) h(xl) h(xl)大于等于右子树的高度 h ( x r ) h(xr) h(xr),整棵树的高度为两棵子树中更高的子树高度加1,即 h ( k ) = h ( ⌈ k 2 ⌉ ) + 1 h(k)=h(\lceil \frac{k}{2} \rceil)+1 h(k)=h(⌈2k⌉)+1
已知当 k ≥ 3 k\geq3 k≥3时,一定有 k 2 < k \frac{k}{2} < k 2k<k- 如果k为偶数,k+1为奇数,
则 h ( k + 1 ) = h ( ⌈ k + 1 2 ⌉ ) + 1 h(k+1)=h(\lceil \frac{k+1}{2} \rceil)+1 h(k+1)=h(⌈2k+1⌉)+1= h ( k 2 + 1 ) + 1 h(\frac{k}{2}+1)+1 h(2k+1)+1
h ( k ) = h ( k 2 ) + 1 h(k)=h(\frac{k}{2})+1 h(k)=h(2k)+1
h ( k + 1 ) − h ( k ) = h ( k 2 + 1 ) − h ( k 2 ) h(k+1)-h(k)=h(\frac{k}{2}+1)-h(\frac{k}{2}) h(k+1)−h(k)=h(2k+1)−h(2k),
已知当 x < k x < k x<k时, h ( x + 1 ) − h ( x ) ≤ 1 h(x+1)-h(x) \leq 1 h(x+1)−h(x)≤1,而当k为正偶数时一定有 k 2 < k \frac{k}{2} < k 2k<k
所以有: h ( k + 1 ) − h ( k ) = h ( k 2 + 1 ) − h ( k 2 ) ≤ 1 h(k+1)-h(k)=h(\frac{k}{2}+1)-h(\frac{k}{2})\leq 1 h(k+1)−h(k)=h(2k+1)−h(2k)≤1。 - 如果k为奇数,k+1为偶数,
则 h ( k + 1 ) = h ( ⌈ k + 1 2 ⌉ ) + 1 h(k+1)=h(\lceil \frac{k+1}{2} \rceil)+1 h(k+1)=h(⌈2k+1⌉)+1= h ( k + 1 2 + 1 ) + 1 h(\frac{k+1}{2}+1)+1 h(2k+1+1)+1
h ( k ) = h ( ⌈ k 2 ⌉ ) + 1 = h ( k + 1 2 ) + 1 h(k)=h(\lceil\frac{k}{2}\rceil)+1 = h(\frac{k+1}{2})+1 h(k)=h(⌈2k⌉)+1=h(2k+1)+1
h ( k + 1 ) − h ( k ) = h ( k + 1 2 + 1 ) − h ( k + 1 2 ) h(k+1)-h(k)=h(\frac{k+1}{2}+1)-h(\frac{k+1}{2}) h(k+1)−h(k)=h(2k+1+1)−h(2k+1),
已知当 x < k x < k x<k时, h ( x + 1 ) − h ( x ) ≤ 1 h(x+1)-h(x) \leq 1 h(x+1)−h(x)≤1,而当k>1且为正奇数时一定有 k + 1 2 < k \frac{k+1}{2} < k 2k+1<k
所以有: h ( k + 1 ) − h ( k ) = h ( k + 1 2 + 1 ) − h ( k + 1 2 ) ≤ 1 h(k+1)-h(k)=h(\frac{k+1}{2}+1)-h(\frac{k+1}{2}) \leq 1 h(k+1)−h(k)=h(2k+1+1)−h(2k+1)≤1。
综上:根结点区间长度相差1的两棵线段树的高度相差小于等于1
- 如果k为偶数,k+1为奇数,
证明:线段树是平衡二叉树
对于线段树中任何分支结点
- 如果该结点表示的区间长度为偶数,则其左右孩子表示的区间长度相等,其左右子树的高度相等。
- 如果该结点表示的区间长度为奇数,则其左孩子表示的区间长度比右孩子表示的区间长度大1,根据引理1,其左右子树的高度相差不大于1。
线段树中任何分支结点的左右子树高度相差不大于1,线段树是平衡二叉树。
二、区间长度为n的线段树的高度为 ⌈ l o g 2 n ⌉ + 1 \lceil log_2{n}\rceil+1 ⌈log2n⌉+1
证明:区间长度为n的线段树的高度为 ⌈ l o g 2 n ⌉ + 1 \lceil log_2{n}\rceil+1 ⌈log2n⌉+1
使用数学归纳法
- 易知当n为1时线段树高度为1、n为2时线段树高度为2,该式成立。
- 已知
k
≥
3
k\geq3
k≥3,当n<k时区间长度为n的线段树的高度为
⌈
l
o
g
2
n
⌉
+
1
\lceil log_2{n}\rceil+1
⌈log2n⌉+1,当区间长度n=k时
- 如果k为偶数,该结点的两个孩子表示的区间长度为 k 2 \frac{k}{2} 2k,已知当 k ≥ 3 k\ge3 k≥3时满足 k 2 < k \frac{k}{2}<k 2k<k,所以子树的高度为 ⌈ l o g 2 k 2 ⌉ + 1 = ⌈ l o g 2 k − 1 ⌉ + 1 = ⌈ l o g 2 k ⌉ \lceil log_2{\frac{k}{2}}\rceil+1 = \lceil log_2{k}-1\rceil+1=\lceil log_2{k}\rceil ⌈log22k⌉+1=⌈log2k−1⌉+1=⌈log2k⌉。根结点区间长度为n的线段树的高度为子树高度最大值加1,即 ⌈ l o g 2 k ⌉ + 1 \lceil log_2{k}\rceil+1 ⌈log2k⌉+1
- 如果k为奇数,该结点左孩子表示的区间长度为
k
+
1
2
\frac{k+1}{2}
2k+1,左孩子区间长度大于等于右孩子区间,因此左子树高度大于等于右子树高度,整棵树的高度为左子树高度+1。
已知当 k ≥ 3 k\ge3 k≥3时满足 k + 1 2 < k \frac{k+1}{2}<k 2k+1<k,所以子树高度为 ⌈ l o g 2 k + 1 2 ⌉ + 1 = ⌈ l o g 2 ( k + 1 ) − 1 ⌉ + 1 = ⌈ l o g 2 ( k + 1 ) ⌉ \lceil log_2{\frac{k+1}{2}}\rceil+1 = \lceil log_2{(k+1)}-1\rceil+1=\lceil log_2{(k+1)}\rceil ⌈log22k+1⌉+1=⌈log2(k+1)−1⌉+1=⌈log2(k+1)⌉
因为 k ≥ 3 k\geq3 k≥3,且是奇数,一定存在x满足: 2 x − 1 < k < k + 1 ≤ 2 x 2^{x-1}<k<k+1\le 2^x 2x−1<k<k+1≤2x
因此 x − 1 < l o g 2 k < l o g 2 ( k + 1 ) ≤ x x-1<log_2k<log_2(k+1)\le x x−1<log2k<log2(k+1)≤x
所以 ⌈ l o g 2 k ⌉ = ⌈ l o g 2 ( k + 1 ) ⌉ = x \lceil log_2k \rceil = \lceil log_2(k+1)\rceil = x ⌈log2k⌉=⌈log2(k+1)⌉=x
所以左子树高度为 ⌈ l o g 2 ( k + 1 ) ⌉ = ⌈ l o g 2 k ⌉ \lceil log_2(k+1)\rceil =\lceil log_2k \rceil ⌈log2(k+1)⌉=⌈log2k⌉,树高度为 ⌈ l o g 2 k ⌉ + 1 \lceil log_2k \rceil+1 ⌈log2k⌉+1
综上,区间长度为n的线段树的高度为 ⌈ l o g 2 n ⌉ + 1 \lceil log_2{n}\rceil+1 ⌈log2n⌉+1
三、线段树去掉最下面一层的结点后,是满二叉树。
引理2:当线段树中某结点左子树高度比右子树高度大1时,右子树是满二叉树。
证明:
设该线段树根结点表示区间长度为k,左右子树高度不同时k一定是奇数,左子树区间长度
k
+
1
2
\frac{k+1}{2}
2k+1,右子树区间长度
k
−
1
2
\frac{k-1}{2}
2k−1,高度差
⌈
l
o
g
2
k
+
1
2
⌉
+
1
−
⌈
l
o
g
2
k
−
1
2
⌉
−
1
=
⌈
l
o
g
2
(
k
+
1
)
⌉
−
⌈
l
o
g
2
(
k
−
1
)
⌉
=
1
\lceil log_2{\frac{k+1}{2}} \rceil+1-\lceil log_2{\frac{k-1}{2}} \rceil-1=\lceil log_2(k+1)\rceil-\lceil log_2(k-1)\rceil=1
⌈log22k+1⌉+1−⌈log22k−1⌉−1=⌈log2(k+1)⌉−⌈log2(k−1)⌉=1
记:
x
=
⌈
l
o
g
2
(
k
−
1
)
⌉
x=\lceil log_2(k-1)\rceil
x=⌈log2(k−1)⌉,则
x
+
1
=
⌈
l
o
g
2
(
k
+
1
)
⌉
x+1=\lceil log_2(k+1)\rceil
x+1=⌈log2(k+1)⌉
因此有
x
−
1
<
l
o
g
2
(
k
−
1
)
≤
x
<
l
o
g
2
(
k
+
1
)
≤
x
+
1
x-1 < log_2(k-1) \le x < log_2(k+1) \le x+1
x−1<log2(k−1)≤x<log2(k+1)≤x+1
即
2
x
−
1
<
k
−
1
≤
2
x
<
k
+
1
≤
2
x
+
1
2^{x-1}<k-1\le 2^x < k+1 \le 2^{x+1}
2x−1<k−1≤2x<k+1≤2x+1
由于k是奇数,如果
k
<
2
x
k<2^x
k<2x,则
k
+
1
≤
2
x
k+1\le 2^x
k+1≤2x,这与上述情况相悖。
由于k是奇数,不能是2的幂,所以
k
≠
2
x
k \neq 2^x
k=2x
所以一定有
k
>
2
x
k>2^x
k>2x,同时
k
−
1
≤
2
x
k-1\le 2^x
k−1≤2x,此时只能是
k
−
1
=
2
x
k-1=2^x
k−1=2x
右子树区间长度
k
−
1
2
=
2
x
−
1
\frac{k-1}{2}=2^{x-1}
2k−1=2x−1,是2的幂。
区间长度为2的幂的线段树一定是满二叉树,因此右子树是满二叉树。
证明:线段树去掉最下面一层的结点后,是满二叉树。
使用数学归纳法证明
- 易知,当根结点区间长度为1、2时,满足该定理。
- 已知k>=3,假设当根结点区间长度小于k时,线段树去掉最下面一层的结点后,是满二叉树。
当根结点区间长度等于k时,整棵树高度为h,其左右子树表示的区间长度小于k。- 如果k是偶数,其左右子树区间长度相同,左右子树结构相同。左右子树区间长度小于k,分别去掉最下面一层结点后,左右子树都是满二叉树,加上表示区间长度为k的根结点后,仍然是满二叉树。
- 如果k是奇数,其左子树区间长度为
⌈
k
2
⌉
\lceil \frac{k}{2} \rceil
⌈2k⌉, 右子树区间长度为
⌊
k
2
⌋
\lfloor\frac{k}{2}\rfloor
⌊2k⌋,左右子树区间长度都小于k。
如果两子树高度相同,去掉最下面一层结点后,左右子树都是满二叉树,加上表示区间长度为k的根结点后,仍然是满二叉树。
如果两子树高度不同,根据线段树是平衡二叉树,以及左孩子表示的区间长度 ⌈ k 2 ⌉ \lceil \frac{k}{2} \rceil ⌈2k⌉大于等于右孩子表示的区间长度 ⌊ k 2 ⌋ \lfloor\frac{k}{2}\rfloor ⌊2k⌋,只能是左子树高度比右子树高度大1。左子树高度小于k,去掉最下面一层后是满二叉树。根据引理2,右子树是满二叉树。加上表示区间长度为k的根结点后,仍然是满二叉树。
四、用顺序存储结构保存区间长为n的线段树,需要位置数最多为4n-1。
该线段树数的高度为
h
=
⌈
l
o
g
2
n
⌉
+
1
h=\lceil log_2{n}\rceil+1
h=⌈log2n⌉+1,线段树结点最多时为高度为
h
h
h的满二叉树,顺序存储结构需要的空间为高度为
h
h
h的满二叉树的结点数。
高为h的满二叉树的结点数为
2
h
−
1
=
2
⌈
l
o
g
2
n
⌉
+
1
−
1
2^h-1=2^{\lceil log_2{n}\rceil+1}-1
2h−1=2⌈log2n⌉+1−1
设
x
=
⌈
l
o
g
2
n
⌉
x=\lceil log_2{n}\rceil
x=⌈log2n⌉,则
x
−
1
<
l
o
g
2
n
≤
x
x-1<log_2n\le x
x−1<log2n≤x,
左侧1移到右边,有
x
<
l
o
g
2
n
+
1
x < log_2n+1
x<log2n+1,即
⌈
l
o
g
2
n
⌉
<
l
o
g
2
n
+
1
\lceil log_2{n}\rceil<log_2n+1
⌈log2n⌉<log2n+1
所以高为h的满二叉树的结点数为
2
⌈
l
o
g
2
n
⌉
+
1
−
1
<
2
l
o
g
2
n
+
1
+
1
−
1
=
2
l
o
g
2
n
+
2
−
1
=
4
∗
2
l
o
g
2
n
−
1
=
4
n
−
1
2^{\lceil log_2{n}\rceil+1}-1<2^{log_2n+1+1}-1=2^{log_2n+2}-1=4*2^{log_2n}-1=4n-1
2⌈log2n⌉+1−1<2log2n+1+1−1=2log2n+2−1=4∗2log2n−1=4n−1
因此若已知
n
≤
N
n\le N
n≤N,表示线段树的数组长度一般设为4N。
五、区间长度为n的线段树中结点数量为2n-1
引理3:二叉树度为0的结点数为 n 0 n_0 n0,度为2的结点数为 n 2 n_2 n2,满足 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1
证明:二叉树度为0的结点数为
n
0
n_0
n0,度为1的结点数为
n
1
n_1
n1,度为2的结点数为
n
2
n_2
n2,总结点数为
n
0
+
n
1
+
n
2
n_0+n_1+n_2
n0+n1+n2
结点也可以根据父结点的度数分类。
父结点度为0的结点不存在。
父结点度为1的结点数,为度为1的结点数的孩子数量,为
n
1
n_1
n1。
父结点度为2的结点数,为度为2的结点数的孩子数量,为
2
n
2
2n_2
2n2
还有没有父结点的根结点,数量为1。总结点数为
2
n
2
+
n
1
+
1
2n_2+n_1+1
2n2+n1+1。
所以
n
0
+
n
1
+
n
2
=
2
n
2
+
n
1
+
1
n_0+n_1+n_2 = 2n_2+n_1+1
n0+n1+n2=2n2+n1+1
化简得:
n
0
=
n
2
+
1
n_0=n_2+1
n0=n2+1
证明:区间长度为n的线段树中结点数量为2n-1
已知,区间长度为n的线段树的叶子结点数量为n。而且线段树中没有度为1的结点。
根据引理3:
n
0
=
n
2
+
1
n_0=n_2+1
n0=n2+1,得:
n
2
=
n
0
−
1
n_2=n_0-1
n2=n0−1
线段树中
n
0
=
n
n_0=n
n0=n,
n
1
=
0
n_1=0
n1=0,
n
2
=
n
0
−
1
=
n
−
1
n_2=n_0-1=n-1
n2=n0−1=n−1
总结点数
n
0
+
n
1
+
n
2
=
2
n
−
1
n_0+n_1+n_2=2n-1
n0+n1+n2=2n−1
六、区间长度为n的线段树把任意长为L的子区间划分为不超过 2 l o g 2 L 2log_2L 2log2L个由线段树中结点表示的区间。
引理4:区间长度为n的线段树把任意长为r的前缀区间划分为不超过 l o g 2 r log_2r log2r个由线段树中结点表示的区间。
解释:如果整个区间为[1, n],长为r的前缀区间为[1, r]
证明:使用数学归纳法
- 易知,当n为1、n为2时成立
-
k
≥
3
k\ge3
k≥3,已知当n<k时,定理成立。证明当n=k时,定理成立。
整体区间为 [ 1 , k ] [1, k] [1,k], m = ⌊ k + 1 2 ⌋ = ⌈ k 2 ⌉ m=\lfloor \frac{k+1}{2}\rfloor=\lceil \frac{k}{2}\rceil m=⌊2k+1⌋=⌈2k⌉,左孩子区间 [ 1 , m ] [1, m] [1,m],长度为 ⌈ k 2 ⌉ \lceil \frac{k}{2}\rceil ⌈2k⌉,右孩子区间 [ m + 1 , k ] [m+1, k] [m+1,k],长度为 ⌊ k 2 ⌋ \lfloor \frac{k}{2} \rfloor ⌊2k⌋。- 如果前缀区间
[
1
,
r
]
[1, r]
[1,r]的右端点
r
≤
m
r\le m
r≤m,则
[
1
,
r
]
[1,r]
[1,r]是左子树表示区间的前缀区间,可以完全由表示区间长度为
⌈
k
2
⌉
\lceil \frac{k}{2}\rceil
⌈2k⌉的左子树来划分区间。
已知当n<k时,定理成立。左子树的区间长度 ⌈ k 2 ⌉ < k \lceil \frac{k}{2}\rceil < k ⌈2k⌉<k。所以当 [ 1 , r ] [1,r] [1,r]是左子树表示区间的前缀区间时,定理成立。 - 如果前缀区间
[
1
,
r
]
[1, r]
[1,r]的右端点
r
>
m
r> m
r>m,则将该区间划分为
[
1
,
m
]
,
[
m
+
1
,
r
]
[1, m], [m+1, r]
[1,m],[m+1,r]。
由于 r ≤ k r\le k r≤k,所以 r 2 ≤ k 2 ≤ ⌈ k 2 ⌉ \frac{r}{2} \le \frac{k}{2} \le \lceil \frac{k}{2} \rceil 2r≤2k≤⌈2k⌉
− r 2 ≥ − ⌈ k 2 ⌉ -\frac{r}{2} \ge -\lceil \frac{k}{2} \rceil −2r≥−⌈2k⌉
r − r 2 = r 2 ≥ r − ⌈ k 2 ⌉ r-\frac{r}{2}=\frac{r}{2} \ge r-\lceil \frac{k}{2} \rceil r−2r=2r≥r−⌈2k⌉
[ m + 1 , r ] [m+1,r] [m+1,r]区间长度为 r − ⌈ k 2 ⌉ r-\lceil \frac{k}{2} \rceil r−⌈2k⌉,由表示区间为 [ m + 1 , k ] [m+1, k] [m+1,k]的右子树来划分区间,是右子树表示区间的前缀区间。
r − ⌈ k 2 ⌉ ≤ r 2 r-\lceil \frac{k}{2} \rceil\le \frac{r}{2} r−⌈2k⌉≤2r
已知右子树区间长度 ⌊ k 2 ⌋ < k \lfloor \frac{k}{2} \rfloor<k ⌊2k⌋<k。满足当n<k时定理成立。
即区间长度为 ⌊ k 2 ⌋ \lfloor \frac{k}{2} \rfloor ⌊2k⌋的线段树可以把长为 r − ⌈ k 2 ⌉ r-\lceil \frac{k}{2} \rceil r−⌈2k⌉的前缀区间划分为不超过 l o g 2 ( r − ⌈ k 2 ⌉ ) log_2(r-\lceil \frac{k}{2} \rceil) log2(r−⌈2k⌉)个由线段树中结点表示的区间。
l o g 2 ( r − ⌈ k 2 ⌉ ) ≤ l o g 2 r 2 = l o g 2 r − 1 log_2(r-\lceil \frac{k}{2} \rceil)\le log_2\frac{r}{2}=log_2r-1 log2(r−⌈2k⌉)≤log22r=log2r−1。
因此区间 [ m + 1 , r ] [m+1, r] [m+1,r]被右子树划分成的最大区间数为 l o g 2 r − 1 log_2r-1 log2r−1,加上先前划出的一个区间 [ 1 , m ] [1, m] [1,m],前缀区间 [ 1 , r ] [1, r] [1,r]被表示区间 [ 1 , k ] [1,k] [1,k]的线段树划分成的区间数不多于 l o g 2 r log_2r log2r
- 如果前缀区间
[
1
,
r
]
[1, r]
[1,r]的右端点
r
≤
m
r\le m
r≤m,则
[
1
,
r
]
[1,r]
[1,r]是左子树表示区间的前缀区间,可以完全由表示区间长度为
⌈
k
2
⌉
\lceil \frac{k}{2}\rceil
⌈2k⌉的左子树来划分区间。
综上:区间长度为n的线段树把任意长为r的前缀区间划分为不超过 l o g 2 r log_2r log2r个由线段树中结点表示的区间
引理5:区间长度为n的线段树把任意长为r的后缀区间划分为不超过 l o g 2 r log_2r log2r个由线段树中结点表示的区间。
解释:如果整个区间为[1, n],长为r的后缀区间为[n-r+1, n]
证明:使用数学归纳法
- 易知,当n为1、n为2时成立
-
k
≥
3
k\ge3
k≥3,已知当n<k时,定理成立。证明当n=k时,定理成立。
整体区间为 [ 1 , k ] [1, k] [1,k], m = ⌊ k + 1 2 ⌋ = ⌈ k 2 ⌉ m=\lfloor \frac{k+1}{2}\rfloor=\lceil \frac{k}{2}\rceil m=⌊2k+1⌋=⌈2k⌉,左孩子区间 [ 1 , m ] [1, m] [1,m],长度为 ⌈ k 2 ⌉ \lceil \frac{k}{2}\rceil ⌈2k⌉,右孩子区间 [ m + 1 , k ] [m+1, k] [m+1,k],长度为 ⌊ k 2 ⌋ \lfloor \frac{k}{2} \rfloor ⌊2k⌋。
考察后缀区间 [ l , k ] [l, k] [l,k],该区间长为r,即 r = k − l + 1 r=k-l+1 r=k−l+1
当 l = 1 l=1 l=1时,区间 [ l , k ] [l, k] [l,k]长度为k,可以由划分为1个线段树中的区间 [ 1 , k ] [1, k] [1,k],当 k ≥ 3 k\ge3 k≥3时一定满足 1 ≤ l o g 2 k 1\le log_2k 1≤log2k,是满足定理的。
因此以下讨论中,假定 l > 1 l>1 l>1,也就是区间 [ l , k ] [l, k] [l,k]的长度 r < k r<k r<k- 如果后缀区间
[
l
,
k
]
[l, k]
[l,k]的左端点
l
≥
m
+
1
l \ge m+1
l≥m+1,则
[
l
,
k
]
[l,k]
[l,k]是右子树表示区间的后缀区间,可以完全由表示区间长度为
⌊
k
2
⌋
\lfloor \frac{k}{2}\rfloor
⌊2k⌋的右子树来划分区间。
已知当n<k时,定理成立。右子树的区间长度 ⌊ k 2 ⌋ < k \lfloor \frac{k}{2}\rfloor < k ⌊2k⌋<k。所以当 [ l , k ] [l,k] [l,k]是右子树表示区间的后缀区间时,定理成立。 - 如果后缀区间
[
l
,
k
]
[l, k]
[l,k]的左端点
l
≤
m
l\le m
l≤m,则将该区间划分为
[
l
,
m
]
,
[
m
+
1
,
k
]
[l, m], [m+1, k]
[l,m],[m+1,k]。
由于区间 [ l , k ] [l,k] [l,k]的长度 r < k r < k r<k,所以 r + 1 ≤ k r+1\le k r+1≤k
r + 1 2 ≤ k 2 \frac{r+1}{2} \le \frac{k}{2} 2r+1≤2k
r 2 ≤ ⌊ r + 1 2 ⌋ ≤ ⌊ k 2 ⌋ \frac{r}{2} \le \lfloor \frac{r+1}{2} \rfloor \le \lfloor \frac{k}{2}\rfloor 2r≤⌊2r+1⌋≤⌊2k⌋
− r 2 ≥ − ⌊ k 2 ⌋ -\frac{r}{2} \ge -\lfloor \frac{k}{2} \rfloor −2r≥−⌊2k⌋
r − r 2 = r 2 ≥ r − ⌊ k 2 ⌋ r-\frac{r}{2}=\frac{r}{2} \ge r-\lfloor \frac{k}{2} \rfloor r−2r=2r≥r−⌊2k⌋
[ l , m ] [l, m] [l,m]区间长度为 r − ⌊ k 2 ⌋ r-\lfloor\frac{k}{2}\rfloor r−⌊2k⌋,由表示区间为 [ 1 , m ] [1, m] [1,m]的左子树来划分区间,是左子树表示区间的后缀区间。
r − ⌊ k 2 ⌋ ≤ r 2 r-\lfloor \frac{k}{2} \rfloor\le \frac{r}{2} r−⌊2k⌋≤2r
左子树区间长度 ⌈ k 2 ⌉ < k \lceil \frac{k}{2} \rceil<k ⌈2k⌉<k。已知当n<k时定理成立。
即区间长度为 ⌈ k 2 ⌉ \lceil \frac{k}{2} \rceil ⌈2k⌉的线段树可以把长为 r − ⌊ k 2 ⌋ r-\lfloor \frac{k}{2} \rfloor r−⌊2k⌋的前缀区间划分为不超过 l o g 2 ( r − ⌊ k 2 ⌋ ) log_2(r-\lfloor \frac{k}{2} \rfloor) log2(r−⌊2k⌋)个由线段树中结点表示的区间。
l o g 2 ( r − ⌊ k 2 ⌋ ) ≤ l o g 2 r 2 = l o g 2 r − 1 log_2(r-\lfloor \frac{k}{2} \rfloor)\le log_2\frac{r}{2}=log_2r-1 log2(r−⌊2k⌋)≤log22r=log2r−1。
因此区间 [ l , m ] [l, m] [l,m]被左子树划分成的最大区间数为 l o g 2 r − 1 log_2r-1 log2r−1,加上先前划出的一个区间 [ m + 1 , k ] [m+1, k] [m+1,k],后缀区间 [ l , k ] [l, k] [l,k]被表示区间 [ 1 , k ] [1,k] [1,k]的线段树划分成的区间数不多于 l o g 2 r log_2r log2r
- 如果后缀区间
[
l
,
k
]
[l, k]
[l,k]的左端点
l
≥
m
+
1
l \ge m+1
l≥m+1,则
[
l
,
k
]
[l,k]
[l,k]是右子树表示区间的后缀区间,可以完全由表示区间长度为
⌊
k
2
⌋
\lfloor \frac{k}{2}\rfloor
⌊2k⌋的右子树来划分区间。
综上:区间长度为n的线段树把任意长为r的后缀区间划分为不超过 l o g 2 r log_2r log2r个由线段树中结点表示的区间
证明:区间长度为n的线段树把任意长为L的子区间划分为不超过 2 l o g 2 L 2log_2L 2log2L个由线段树中结点表示的区间。
使用数学归纳法
- 易知,当n=1, n=2时成立
-
k
≥
3
k\ge 3
k≥3,已知
n
<
k
n<k
n<k时定理成立,证明
n
=
k
n=k
n=k时定理成立
记长为L的区间为 [ l , r ] [l, r] [l,r],有3种情况:
线段树表示的整体区间为 [ 1 , k ] [1, k] [1,k], m = ⌊ k + 1 2 ⌋ = ⌈ k 2 ⌉ m=\lfloor \frac{k+1}{2}\rfloor=\lceil \frac{k}{2}\rceil m=⌊2k+1⌋=⌈2k⌉,左孩子区间 [ 1 , m ] [1, m] [1,m],长度为 ⌈ k 2 ⌉ \lceil \frac{k}{2}\rceil ⌈2k⌉,右孩子区间 [ m + 1 , k ] [m+1, k] [m+1,k],长度为 ⌊ k 2 ⌋ \lfloor \frac{k}{2} \rfloor ⌊2k⌋。
- 如果 r ≤ m r\le m r≤m,则区间 [ l , r ] [l, r] [l,r]完全可以由左子树来划分区间,由于左子树表示的区间长度 ⌈ k 2 ⌉ ≤ k \lceil \frac{k}{2} \rceil \le k ⌈2k⌉≤k,满足 n < k n<k n<k,定理成立。
- 如果 l ≥ m + 1 l \ge m+1 l≥m+1,则区间 [ l , r ] [l, r] [l,r]完全可以由右子树来划分区间,由于右子树表示的区间长度 ⌊ k 2 ⌋ ≤ k \lfloor \frac{k}{2} \rfloor \le k ⌊2k⌋≤k,满足 n < k n<k n<k,定理成立。
- 如果
l
≤
m
≤
r
l\le m \le r
l≤m≤r,则可以把
[
l
,
r
]
[l, r]
[l,r]区间分为
[
l
,
m
]
,
[
m
+
1
,
r
]
[l, m], [m+1, r]
[l,m],[m+1,r]两个区间。
[ l , m ] [l, m] [l,m]是表示区间 [ 1 , m ] [1, m] [1,m]的左子树的后缀区间,长度为 m − l + 1 m-l+1 m−l+1根据引理5,区间 [ l , m ] [l, m] [l,m]可以被线段树划分为不超过 l o g 2 ( m − l + 1 ) log_2(m-l+1) log2(m−l+1)个区间。
[ m + 1 , r ] [m+1, r] [m+1,r]是表示区间 [ m + 1 , k ] [m+1, k] [m+1,k]的右子树的前缀区间,长度为 r − m r-m r−m,根据引理4,区间 [ m + 1 , r ] [m+1, r] [m+1,r]可以被线段树划分为不超过 l o g 2 ( r − m ) log_2(r-m) log2(r−m)个区间。
l o g 2 ( m − l + 1 ) ≤ l o g 2 ( r − l + 1 ) = l o g 2 L log_2(m-l+1)\le log_2(r-l+1) = log_2L log2(m−l+1)≤log2(r−l+1)=log2L
l o g 2 ( r − m ) ≤ l o g 2 ( r − l + 1 ) = l o g 2 L log_2(r-m) \le log_2(r-l+1)=log_2L log2(r−m)≤log2(r−l+1)=log2L
划分出的总区间数为 l o g 2 ( m − l + 1 ) + l o g 2 ( r − m ) ≤ 2 l o g 2 L log_2(m-l+1)+log_2(r-m)\le 2log_2L log2(m−l+1)+log2(r−m)≤2log2L,定理成立。
综上:区间长度为n的线段树把任意长为L的子区间划分为不超过 2 l o g 2 L 2log_2L 2log2L个由线段树中结点表示的区间。