我想知道data_array数据位置与tree_array数据位置之间是否存在任何关系。
int data[N];
int tree[M]; // lets M = 2^X-1, where X = nearest ceiling power of 2 to N;
void build_segment_tree();
我想知道我是否可以说数据[]的第n个值与第一个值[]映射。有什么数学解决方案吗?
答案 0 :(得分:1)
你当然可以。例如,段树用于存储的能力 细分信息。
现在,您将看到如果要从N
元素中创建分段树
你需要ceil(log_2(N))+1
级别。在最后一级,你会发现所有的
1个长度范围或单个元素。
这些元素将精确地位于(1-index)2^ceil(log_2(N))
到2^ceil(log_2(N))+N-1
的位置。
[1-8]
/ \
[1-4] [5-8]
/ \ / \
[1-2][3-4] [5-6][7-8]
/\ /\ /\ /\
[1][2] [3][4] [5][6] [7][8]
1-11
/ \
1-6 7-11
1-3 4-6 7-9 10-11
1-2 3 4-5 6 7-8 9 10 11
1 2 4 5 7 8
此答案仅适用于2个元素的分段树。
但是对于其他元素,元素不一定是有组织的。
因此对于那些不是2的力量而言,答案将是假的。
在这种情况下,你找不到任何形式的规则。