Java Program to Implement Segment Tree

This Java program is to Implement Segment tree. In computer science, a segment tree is a tree data structure for storing intervals, or segments. It allows querying which of the stored segments contain a given point. It is, in principle, a static structure; that is, its content cannot be modified once the structure is built. A similar data structure is the interval tree.
A segment tree for a set I of n intervals uses O(n log n) storage and can be built in O(n log n) time. Segment trees support searching for all the intervals that contain a query point in O(log n + k), k being the number of retrieved intervals or segments.

Here is the source code of the Java program to Implement Segment Tree. The Java program is successfully compiled and run on a Linux system. The program output is also shown below.

public class SegmentTree
{
    private int[] tree;
    private int maxsize;
    private int height;
 
    private  final int STARTINDEX = 0; 
    private  final int ENDINDEX;
    private  final int ROOT = 0;
 
    public SegmentTree(int size)
    {
        height = (int)(Math.ceil(Math.log(size) /  Math.log(2)));
        maxsize = 2 * (int) Math.pow(2, height) - 1;
        tree = new int[maxsize];
        ENDINDEX = size - 1; 
    }
 
    private int leftchild(int pos)
    {
        return 2 * pos + 1;
    }
 
    private int rightchild(int pos)
    {
        return 2 * pos + 2;
    }
 
    private int mid(int start, int end)
    {
        return (start + (end - start) / 2); 
    }
 
    private int getSumUtil(int startIndex, int endIndex, int queryStart, int queryEnd, int current)
    {
        if (queryStart <= startIndex && queryEnd >= endIndex )
        {
            return tree[current];
        }
        if (endIndex < queryStart || startIndex > queryEnd)
        {
            return 0;
        }
        int mid = mid(startIndex, endIndex);
        return  getSumUtil(startIndex, mid, queryStart, queryEnd, leftchild(current)) 
                 + getSumUtil( mid + 1, endIndex, queryStart, queryEnd, rightchild(current));
    }
 
    public int getSum(int queryStart, int queryEnd)
    {
        if(queryStart < 0 || queryEnd > tree.length)
        {
            return -1;
        }
        return getSumUtil(STARTINDEX, ENDINDEX, queryStart, queryEnd, ROOT);
    }
 
    private int constructSegmentTreeUtil(int[] elements, int startIndex, int endIndex, int current)
    {
        if (startIndex == endIndex)
        {
            tree[current] = elements[startIndex];
            return tree[current];	
        }
        int mid = mid(startIndex, endIndex);
        tree[current] = constructSegmentTreeUtil(elements, startIndex, mid, leftchild(current))
                           + constructSegmentTreeUtil(elements, mid + 1, endIndex, rightchild(current));
        return tree[current];
    }
 
    public void constructSegmentTree(int[] elements)
    {
        constructSegmentTreeUtil(elements, STARTINDEX, ENDINDEX, ROOT);	
    }
 
    private void updateTreeUtil(int startIndex, int endIndex, int updatePos, int update, int current)
    {
        if ( updatePos < startIndex || updatePos > endIndex)
        {
            return;
        }
        tree[current] = tree[current] + update;
        if (startIndex != endIndex)
        {
            int mid = mid(startIndex, endIndex);
            updateTreeUtil(startIndex, mid, updatePos, update, leftchild(current));
            updateTreeUtil(mid+1, endIndex, updatePos, update, rightchild(current));
        }
    }
 
    public void update(int update, int updatePos, int[] elements)
    {
        int updatediff = update - elements[updatePos]  ;
        elements[updatePos] = update;
        updateTreeUtil(STARTINDEX, ENDINDEX, updatePos, updatediff, ROOT);
    }
 
    public static void main(String...arg)
    {
        int[] elements = {1,3,5,7,9,11};
        SegmentTree segmentTree = new SegmentTree(6);
        segmentTree.constructSegmentTree(elements);
        int num = segmentTree.getSum(1, 5);
 
        System.out.println("the num is " + num);
        segmentTree.update(10, 5,elements);
        num = segmentTree.getSum(1, 5);
        System.out.println("the num is " + num);	
    }  	
}
$javac SegmentTree.java
$java SegmentTree
the sum is 35
the sum is 34

Related posts:

Phân biệt JVM, JRE, JDK
Java Program to Check if a Given Set of Three Points Lie on a Single Line or Not
Assertions in JUnit 4 and JUnit 5
Control the Session with Spring Security
Java Program to subtract two large numbers using Linked Lists
Java Program to Implement the Bin Packing Algorithm
Java Program to Implement the Binary Counting Method to Generate Subsets of a Set
Ignore Null Fields with Jackson
Java Program to Implement wheel Sieve to Generate Prime Numbers Between Given Range
Guide to WeakHashMap in Java
Java Program to Find Minimum Number of Edges to Cut to make the Graph Disconnected
Bootstrap a Web Application with Spring 5
Java Program to Find the Connected Components of an UnDirected Graph
Java Program to Perform String Matching Using String Library
Java Switch Statement
Java Program to Implement the Hill Cypher
Java Program to Implement the Monoalphabetic Cypher
Loại bỏ các phần tử trùng trong một ArrayList như thế nào?
Java Program to Find MST (Minimum Spanning Tree) using Kruskal’s Algorithm
Sử dụng Fork/Join Framework với ForkJoinPool trong Java
Tạo ứng dụng Java RESTful Client với thư viện Retrofit
Java Program to Check Multiplicability of Two Matrices
Jackson vs Gson
Debug a HttpURLConnection problem
Create a Custom Exception in Java
Generating Random Dates in Java
Hướng dẫn Java Design Pattern – Bridge
Pagination and Sorting using Spring Data JPA
Java Program to Implement Hash Tables chaining with Singly Linked Lists
Java Program to Implement ArrayList API
Java Program to Implement the Checksum Method for Small String Messages and Detect
Find the Registered Spring Security Filters