Java 芬威克树
我试图用Java实现Fenwick树,但没有得到预期的结果。 这是我的密码:Java 芬威克树,java,algorithm,fenwick-tree,Java,Algorithm,Fenwick Tree,我试图用Java实现Fenwick树,但没有得到预期的结果。 这是我的密码: import java.io.*; import java.util.*; import java.math.*; class fenwick1 { public static int N; public static long[] a; public static void main(String[] args)throws IOException { BufferedRea
import java.io.*;
import java.util.*;
import java.math.*;
class fenwick1 {
public static int N;
public static long[] a;
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
a = new long[N];
String[] str = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
a[i] = Long.parseLong(str[i]);
}
increment(2, 10);
System.out.println(a[2]);
System.out.println(query(4));
}
public static void increment(int at, int by) {
while (at < a.length) {
a[at] += by;
at |= (at + 1);
}
}
public static int query(int at) {
int res = 0;
while (at >= 0) {
res += a[at];
at = (at & (at + 1)) - 1;
}
return res;
}
}
import java.io.*;
导入java.util.*;
导入java.math.*;
芬威克1级{
公共静态int N;
公共静态长[]a;
公共静态void main(字符串[]args)引发IOException{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
N=Integer.parseInt(br.readLine());
a=新长[N];
字符串[]str=br.readLine().split(“”);
对于(int i=0;i=0时){
res+=a[at];
at=(at&(at+1))-1;
}
返回res;
}
}
当我提出意见时:
1012345678910 我得到: 13
十九, 因此,增量函数运行良好。但是查询(4)应该给出索引4的累计总和,即 (1+2+13+4+5)=25
您没有正确初始化它。 而不是:
for (int i = 0; i < N; i++) {
a[i] = Long.parseLong(str[i]);
}
如果原始数组是{1,1,1,1,1,1,1,1,1,1},那么a={1,2,3,4,5,6,7,8,9,10}。在增量(2,10)之后,a={1,2,13,4,5,6,7,8,9,10}。它是正确的吗?@user2784016不,它是不正确的
a[i]
存储从i&(i+1)
到i
的累积和,而不是整个前缀和。最初a={1,2,1,4,1,2,1,8,1,2}
。在添加10
之后,它是{1,2,11,14,1,2,1,18,1,2}
。我想在数组a中初始化一个数组(不是累积和)。然后我需要增加一些元素,并使用Fenwick树找到某个索引的累积和。你能修改我的代码来解决这个问题吗?@user2784016然后你需要修改数组:第一个用于数组本身,另一个用于累积和。然后我使用累积数组上的增量和查询函数,得到原始数组的答案。不是吗?
for (int i = 0; i < N; i++) {
increment(i, (int)Long.parseLong(str[i]));
}
long[] initA = new long[N];
for (int i = 0; i < N; i++) {
initA[i] = Long.parseLong(str[i]);
increment(i, (int)initA[i]);
}