arjun95's blog

By arjun95, history, 6 years ago, In English

how to prove space complexity in segment tree is O(4*n).

 
 
 
 
  • Vote: I like it
  • +10
  • Vote: I do not like it

»
6 years ago, # |
Rev. 2   Vote: I like it +13 Vote: I do not like it

Segment tree with 2^x leaf nodes will have 2^(x+1) — 1 total nodes because it is a perfect binary tree.

Now, you will have useless leaf nodes if you are using general n. Therefore at worst you will have almost 2*n leaf nodes because you must round up to the next power of two. If n is 2^j + 1, then you must have 2^(j+1) leaf nodes = O(2*n).

And as we proved before total nodes is ~2 * leaf nodes so we have 2*2*n = O(4n) total space.

  • »
    »
    6 years ago, # ^ |
      Vote: I like it -28 Vote: I do not like it

    thanks for explanation. is there any other mathematical proof to prove this?

    • »
      »
      »
      6 years ago, # ^ |
      Rev. 2   Vote: I like it +3 Vote: I do not like it

      If you're not satisfied by the above proof here is another:

      Last layer: nodes
      Pre-last layer: nodes


      So, we have nodes.
      You can see the infinite geometric progression on the right. Its sum is equal to , where is first element of progression ( here) and is ratio between two adjacent elements ( here).
      So, there is a total of nodes in a segment tree.

»
6 years ago, # |
Rev. 3   Vote: I like it -13 Vote: I do not like it

This problem was one of the INOI 2012-2013 problems.

At first note that we need exactly n - 1 nodes, but if we use arrays and set id of left child of node with id Id to Id and Id + 1 id to right one, we need an array with size n, let's prove.

Let f(n) the maximum id that we need in segment tree. Let's prove f(2n + 1) = 4·2n - 1. We can prove it using induction, f(21 + 1) = 7, f(2n + 1) = 2·f(2n - 1 + 1) + 1 = 2·(4·2n - 1 - 1) + 1 = 4·2n - 1.

Edit: Definition of f(n) has changed.

»
6 years ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

Let k be the smallest natural number such that 2k ≥ n. Note that 2k < 2 × n. We will find the answer for 2k. The segment tree, and indeed any other binary tree formed will have exactly k + 1 levels, the i-th containing 2i nodes. Then, the total number of nodes will be a geometric progression of the form 20 + 21 + 22 + ... + 2k, which is precisely equal to 2k + 1 - 1. Since 2k < 2 * n, it follows immediately that 2k + 1 - 1 < 4 × n, so the number of nodes of the new tree — greater than our answer — is still less than 4 × n.

»
6 years ago, # |
  Vote: I like it +4 Vote: I do not like it

Non-recursive segment trees use exactly 2n - 1 nodes.

  • »
    »
    6 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    @AI.Cash: I've read u non-recursive segment tree. It's very easy, powerful as general segment-tree and required less memory space. But, in non-recursive segment tree how to find lower bound of position for given sum ?? // for perfect binary tree (i.e. n = 2^k):

       int find(int sum){
         int result = 1; 
         while(result < n){ 
              result <<= 1; 
              if(tree[result]< sum)sum-=tree[result++]; } 
         }
         return result;
    }
    

    when n = 2^k, this works fine, but n != 2^k not.

    • »
      »
      »
      6 years ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      Indeed, for n ≠ 2k we basically get not one tree but O(logn) separate perfect trees. So, it doesn't support the techniques where we need to start from the root and move to the leaves, like binary search and fractional cascading.

      • »
        »
        »
        »
        6 years ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        Thx. I'll use O(4n) case with your implementation in this case.