import java.util.Scanner;
/*线段树空间计算程序 Power By:Comzyh*/
class segment {//线段树节点
int b,e;
}
public class SegmentTree{//线段树,用数组实现
static int M=5000000;
segment seg[];
int Nnode;//节点数
int LastNode;//最后一个节点
public SegmentTree(){
seg=new segment[M];
for(int i=0;i<M;i++)
seg[i]=new segment();
}
void build(int b, int e, int root){//构造线段树
Nnode++;
if (root>LastNode)
LastNode=root;
seg[root].b=b;
seg[root].e=e;
if (b==e)
return;
int mid =(b+e)>>1;
build(b,mid,root<<1);
build(mid+1,e,(root<<1)+1);
}
public int getNnode(){
return Nnode;
}
public int getLastNode(){
return LastNode;
}
public static void main(String args[]){
Scanner in=new Scanner(System.in);
int N;
while (true){
System.out.printf("请输入区间长度:\n");
N=in.nextInt();
if (N==0) break;
SegmentTree st=new SegmentTree();
st.build(1,N,1);
System.out.printf("线段树构造完成, 共有%d 节点,最后一个节点是: %d\n",st.getNnode(),st.getLastNode());
//注意:节点个数总是2N-1
}
}
}
运行:
C:\ex>java SegmentTree
请输入区间长度:
5
线段树构造完成, 共有9 节点,最后一个节点是: 9
请输入区间长度:
10
线段树构造完成, 共有19 节点,最后一个节点是: 25
请输入区间长度:
100000
线段树构造完成, 共有199999 节点,最后一个节点是: 262141
源码:
分享到:
相关推荐
长期以来,OIer不知道以一维方式存储线段树到底需要开多大的数组。这篇文章使用了小程序,分析了一维线段树在一维方式存储下的空间占用,并得出了结论:完全二叉树方式存储线段树的空间占用可以用4N来表示。 关于...
1. **构建第一个维度**:首先按照第一维构建一棵线段树。 2. **嵌套第二维度**:在每个节点中再构建一棵线段树,用于处理第二维的区间。 **应用场景**:二维线段树适用于需要在二维空间中处理区间查询的问题,例如...
树状数组和线段树是两种在计算机科学中用于高效处理区间或段上数据更新与查询的数据结构。它们主要用于动态维护一个序列上的前缀和(区间和)问题,即在序列上进行插入、删除和查询操作时保持区间的和。 **树状数组...
- **空间效率**:空间效率方面,树状数组通常更节省空间,因为它只需要存储一个一维数组。 在实际应用中,根据问题的具体需求,可以选择更适合的数据结构。例如,如果仅需处理简单的区间求和或最值,树状数组可能是...
与线段树不同,树状数组只需要一个一维数组来存储信息。每个位置i的值表示以i为右端点的所有前缀和的累积更新。通过特定的前缀和查询和更新公式,可以在对数时间内完成区间操作。树状数组特别适合于在线性空间内进行...
一维树状数组主要用于处理一维数组中的区间查询和更新。数组的索引视为树的层次,数组的每个元素对应树中的一个节点。树的每个非叶节点的值是其两个子节点的值的某种组合,通常是对区间和的计算。以下是一维树状数组...
- **结构**:线段树通常用于存储一维数组的信息,每个非叶子节点的区间为其两个子节点区间的并集。 ##### 1.2 特征 - **平衡性**:由于采用二分法构建,线段树具有很好的平衡性,深度为\[ \log_2 (b - a + 1) \],...
**树状数组(一维、二维)**: 树状数组(也称为二分累积量表)是一种数据结构,可以快速实现对区间元素的加法、查询和修改操作。二维树状数组可以处理多维数据的类似问题。 **线段树**: 线段树是一种数据结构,...
线段树的基本思想是将一维数组划分成若干个子区间,每个子区间对应线段树的一个节点。线段树的每个节点存储对应区间的信息,例如区间和或区间最大值。通过递归地对子节点进行合并,可以快速查询和更新任意区间的值。...
线段树的核心思想是对一个数组进行分治,将一维数组划分为多个连续的子区间,每个子区间对应线段树中的一个节点。通过递归地构建线段树,可以实现对数组区间内的元素进行快速求和、查找最大值、最小值等操作,同时...
线段树将一个大区间(通常是一维数组)分成多个小区间,每个节点代表一个子区间,通过递归的方式构建树形结构。线段树的根节点代表整个区间,叶子节点则对应原区间中的元素。非叶子节点的值通常是由其子节点值通过...
它的核心思想是将一个一维区间分解成多个子区间,然后对每个子区间进行存储和操作。线段树通常用于求解区间和、区间最大值、区间最小值等问题。构建线段树时,我们通常采用分治策略,通过递归将大问题分解为小问题,...
线段树是一种高效的数据结构,用于处理和维护在一维空间中的一系列区间或线段,同时支持动态查询和修改操作。它特别适用于那些需要快速查询区间信息,如求区间和、查找区间内满足条件的元素个数等问题。线段树的核心...
线段树是一种高效的数据结构,尤其在处理区间查询和更新问题上表现突出。它被广泛应用于ACM(国际大学生程序设计竞赛)和其他算法竞赛中,因为它具有简单、基础且易于理解的特点。 线段树的核心是一个完全二叉树,...
最直观的方法是使用一维数组,但这种方法的时间复杂度是O(n^2),当线段数量大时效率低下。另一种方法是离散化,即先对线段的端点进行排序,然后转换为序号进行处理,虽然降低了时间复杂度,但当线段数量多时仍然效率...
一维树状数组(也称作 Fenwick Tree)是基于前缀和的一颗二叉树,每个节点存储了其所有子孙节点对应的数组区间之和。对于二维树状数组,我们将其扩展到两个维度,每个节点存储了对应矩形区域的和。对于一个 m × n ...
线段树通常用来处理在一维空间中的一系列线段,例如在X轴上的一系列线段。这些线段可能重叠,需要动态合并,以计算它们的并集的某些属性,如长度或数量。 线段树的构建方式如下:每个节点代表一个区间[a, b],其中...
线段树可以被用于处理一系列几何问题,尤其是那些涉及到一维或二维空间中区间或区域的问题。例如,它可以用于查找某个点位于哪些区间内,或者找出覆盖某个区间的所有区间集合。在处理这些问题时,线段树通过维护区间...
在C++中,线段树可以通过一维数组来实现。 在线段树的结构中,根节点代表的区间是[1, b],它的左儿子代表区间[a, (a+b)/2],右儿子代表区间[(a+b)/2, b]。当区间长度为1时,这些节点成为叶节点。线段树的节点通常...