【发布时间】:2020-11-18 13:07:36
【问题描述】:
我正在编写一个分段树算法,其中树的节点是数组(它应该代表索引的频率,这对我的问题实际上并不重要)。由于在查询树时需要返回一个数组,我想我必须使用一个静态变量。但这带来了一个问题:当查询由于递归而向下遍历树时,total 数组被覆盖。
int* query(int tree[][9], int i, int j, int pos, int qi, int qj){
if(qi <= i && qj >= j){
return tree[pos];
}else if(qi > j || qj < i){
static int empty[9];
for (size_t k = 0; k < 9; k++) empty[k] = 0;
return empty;
}
int mid = (i+j)/2;
int *left = query(tree, i, mid, 2*pos+1, qi, qj);
int *right = query(tree, mid+1, j, 2*pos+2, qi, qj);
static int total[9];
for (size_t k = 0; k < 9; k++) {
total[k] = left[k] + right[k];
}
return total;
}
【问题讨论】:
-
我推荐的一种方法,而不是从“我认为我必须使用静态变量”开始,而是从您实际需要做的事情开始,然后从那里开始工作。话虽如此,您能否详细描述该算法应该做什么,以便我们可以完成它?照原样,我们知道当前代码不起作用,但我们并不真正知道它应该做什么,所以我们无法帮助您改正。
-
该函数用于查询段树。那棵树的叶子是数组,连接它们的节点是它们的总和。它将从树的顶部开始并检查要查询的所需索引 i 和 j 是否完全重叠(在这种情况下,它返回该节点处的值)或没有重叠(返回零数组)。如果索引有部分重叠,则继续搜索当前检查的节点的左右节点,然后将左右数组的值相加到总数组中,然后返回。
-
如果节点只是整数值,它会很好地工作,但由于它们是数组,我 [认为我] 必须使用静态变量或指针,这会导致数组被覆盖的问题。
-
这是 C++,我们在 2020 年。使用 std::array 或 std::vector
-
'我想我必须使用静态':好吧,停止这么想。你不能。
static和递归不能混用。克服你的心理障碍。
标签: c++ algorithm pointers recursion segment-tree