Is it possible to build a Fenwick tree in O(n)?

前端 未结 2 771
北海茫月
北海茫月 2020-12-23 18:45

Fenwick tree is a data structure which allows two kind of operations (you can augment it with more operations):

  • point update update(index, value)<
相关标签:
2条回答
  • 2020-12-23 19:01

    Here's the Java implementation:

    public BIT(long[] nums) {
            bit = new long[nums.length + 1]; //one-indexed
            for (int i = 1; i <= nums.length; i++) {
                bit[i] += nums[i - 1]; //update node
                if (i + (i & -i) <= nums.length) {
                    bit[i + (i & -i)] += bit[i]; //update parent
                }
            }
        }
    

    Same general idea as j_random_hacker's post: we update the current node and the next higher parent node, using the property that all children nodes will always be visited before their respective parent nodes

    0 讨论(0)
  • 2020-12-23 19:17

    [EDIT: I had things "upside-down" -- fixed now!]

    Yes. Loop through the n array items in increasing index order, always adding the sum only to the next smallest index that it should be added to, instead of to all of them:

    for i = 1 to n:
        j = i + (i & -i)     # Finds next higher index that this value should contribute to
        if j <= n:
            x[j] += x[i]
    

    This works because although every value contributes to several range sums, after processing the bottommost range sum that the value contributes to (which actually requires no "processing", since the sum is already in there), we no longer need to maintain its separate identity -- it can safely be merged with all other values that contribute to the remaining range sums.

    TTBOMK this algorithm is "new" -- but then I haven't looked very hard ;)

    0 讨论(0)
提交回复
热议问题