Javascript 为什么分段树算法不能正常工作?
这是一个段树算法问题: 第一次在构造函数中初始化方法并使用它时,我不知道为什么会出错Javascript 为什么分段树算法不能正常工作?,javascript,Javascript,这是一个段树算法问题: 第一次在构造函数中初始化方法并使用它时,我不知道为什么会出错 Error : function build_tree(arr, tree, node, start, end){ RangeError: Maximum call stack size exceeded update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val); 更新: 在原型上找不到此函数 update_tre
Error :
function build_tree(arr, tree, node, start, end){
RangeError: Maximum call stack size exceeded
update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val);
更新:
在原型上找不到此函数
update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val);
^
ReferenceError: update_tree is not defined
update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val);
^
ReferenceError: update_tree is not defined
更新:
sumRange
返回未索引
以下代码:
/**
* @param {number[]} nums
*/
var NumArray = function (nums) {
if(nums.length === 0) return;
this.nums = nums;
this.size = this.nums.length;
this.tree = [];
build_tree(this.nums, this.tree, 0, 0, this.size - 1);
function build_tree(arr, tree, node, start, end){
if (start == end) {
tree[node] == arr[start];
} else {
let mid = parseInt((start + end) / 2);
let left_node = 2 * node + 1;
let right_node = 2 * node + 2;
build_tree(arr, tree, left_node, start, mid);
build_tree(arr, tree, right_node, mid+1, end);
tree[node] == tree[left_node] + tree[right_node];
}
}
};
/**
* @param {number} i
* @param {number} val
* @return {void}
*/
NumArray.prototype.update = function (i, val) {
update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val);
function update_tree(arr, tree, node, start, end, idx, val){
if (start == end) {
arr[idx] = val;
tree[node] = val;
} else {
let mid = parseInt((start + end) / 2);
let left_node = 2 * node + 1;
let right_node = 2 * node + 2;
if (idx >= start && idx <= mid) {
update_tree(arr, tree, left_node, start, mid, idx, val)
} else {
update_tree(arr, tree, right_node, mid + 1, end, idx, val)
}
tree[node] = tree[left_node] + tree[right_node];
}
}
};
/**
* @param {number} i
* @param {number} j
* @return {number}
*/
NumArray.prototype.sumRange = function (i, j) {
return query_tree(this.nums, this.tree, 0, 0, this.size - 1, i, j);
function query_tree(arr, tree, node, start, end, L, R) {
if (R < start || L > end) {
return 0;
} else if (start == end) {
return arr[start];
} else if (L <= start && end <= R) {
return tree[node];
} else {
let mid = parseInt((start + end) / 2);
let left_node = 2 * node + 1;
let right_node = 2 * node + 2;
let sum_left = query_tree(arr, tree, left_node, start, mid, L, R);
let sum_right = query_tree(arr, tree, right_node, mid + 1, end, L, R);
return sum_left + sum_right;
}
}
};
var obj = new NumArray([1, 3, 5]);
console.log(obj.sumRange(0, 2));
console.log(obj.update(1, 2))
console.log(obj.sumRange(0, 2));
更新:
sumRange
返回未索引
我试图使用IIFE
,但不能使用递归
为什么?
你能帮我吗?在
构建树中如果(开始==结束)
,开始总是0
,结束永远不会到达0
,因为让中间=(开始+结束)/2
并将mid
传递到build_tree
您可以尝试let mid=parseInt((开始+结束)/2)代码>@Taki已经添加了parseInt,我想知道为什么ReferenceError:query\u树不可用defined@Amadeus我添加了parseInt,我想知道为什么ReferenceError:query_树没有准确地定义我向您展示的内容。您应该使用=
并在使用前定义它