求助:证明线段树的高度为ceil(log(n))的严谨推导
线段树高度为
ceil(log₂n)的严谨证明 定义与前提
先明确几个关键定义:
- 线段树的高度:指从根节点到最远叶子节点的边数(根节点为第0层,叶子节点所在层数即为高度)。
- 对于原数组大小
n,ceil(log₂n)表示不小于log₂n的最小整数。
分情况证明
情况1:n是2的幂,即n=2^k(k为非负整数)
此时原数组可完全二分拆分:
- 根节点对应区间
[1, 2^k],每一层的区间大小都是上一层的1/2; - 经过
k次拆分后,所有叶子节点都对应单个元素的区间[i,i](1≤i≤2^k); - 根到叶子的边数为
k,而log₂n=k,因此ceil(log₂n)=k,与线段树高度完全一致。
情况2:n不是2的幂,即存在整数k,使得2^k < n < 2^(k+1)
此时ceil(log₂n)=k+1,需证明线段树高度为k+1:
拆分逻辑推导:
线段树的构建规则是:若节点对应区间长度大于1,则拆分为左子区间[l, mid]和右子区间[mid+1, r](mid=(l+r)//2,整数除法)。
对于原数组的第n个元素,其所在区间的拆分路径中,每次拆分的右子区间长度至少为2^(k-1)(因n>2^k),经过k次拆分后,区间长度会缩小到1,此时总共经过k+1层(根为第0层,叶子为第k+1层),对应高度k+1。数学归纳法验证:
- 基例:当
n=1时,ceil(log₂1)=0,线段树高度为0,成立;n=3时,ceil(log₂3)=2,线段树高度为2,成立。 - 归纳假设:假设对于所有
1≤m<n,线段树高度为ceil(log₂m)。 - 归纳步骤:对于
n,拆分为左半部分n₁=⌊n/2⌋和右半部分n₂=⌈n/2⌉,易知2^(k-1) ≤ n₁ ≤ 2^k,2^(k-1)+1 ≤ n₂ ≤ 2^k,因此ceil(log₂n₁)=ceil(log₂n₂)=k。整个线段树的高度为1 + max(ceil(log₂n₁), ceil(log₂n₂))=1+k=ceil(log₂n),成立。
- 基例:当
结合实例验证
- 当
n=4(2^2),线段树叶子全为单个元素,高度为2,ceil(log₂4)=2,匹配; - 当
n=5(2^2<5<2^3),线段树最远叶子的高度为3,ceil(log₂5)=3,匹配;此时部分中间节点的子区间可能包含2个元素(如拆分[4,5]前的节点),但最远叶子仍需k+1层才能拆分到单个元素,符合高度公式。
内容的提问来源于stack exchange,提问作者Pratham Yadav
相关产品推荐
相关产品推荐

