Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 芬威克树_Java_Algorithm_Fenwick Tree - Fatal编程技术网

Java 芬威克树

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

我试图用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 {
        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;
}
}
当我提出意见时:

10
12345678910

我得到:

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]);
}