zoukankan      html  css  js  c++  java
  • 线段树

    概述

          线段树是一种平衡二叉查找树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。主要的处理思想是基于分治的思想。它的逻辑结构如下:线段树是一种平衡二叉查找树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。主要的处理思想是基于分治的思想。它的逻辑结构如下:

        

    设根节点的区间为[a,b),区间长度为L = b - a,线段树的性质:

    (1)线段树是一个平衡树,树的高度为log(L)

    (2)线段树把区间上的任意长度为L的线段都分成不超过2log(L)线段的并

    节点定义

     

     * public class SegmentTreeNode {
     *     public int start, end, max;
     *     public SegmentTreeNode left, right;
     *     public SegmentTreeNode(int start, int end, int max) {
     *         this.start = start;
     *         this.end = end;
     *         this.max = max
     *         this.left = this.right = null;
     *     }
     * }
    View Code

     

    建立

        public SegmentTreeNode buildTree(int start, int end, int[] A){
            if (start > end) return null;
            if (start == end){
                return new SegmentTreeNode(start, end, A[start]);
            }
            SegmentTreeNode node = new SegmentTreeNode(start, end, A[start]);
            int mid = (start + end) / 2;
            node.left = this.buildTree(start, mid, A);
            node.left = this.buildTree(mid + 1, end, A);
            if (node.left != null && node.left.max > node.max){
                node.max = node.left.max;
            }
            if (node.right != null && node.right.max > node.max){
                node.max = node.right.max;
            }
            return node;
        }
    View Code

    查询

        public int query(SegmentTreeNode root, int start, int end) {
            // write your code here
            if (root.start == start && root.end == end){
                return root.max;
            }
            int mid = (root.start + root.end) / 2;
            int leftM = Integer.MIN_VALUE, rightM = Integer.MIN_VALUE;
            if (start <= mid){
                if (mid < end){
                    leftM =  query(root.left, start, mid);
                }else {
                    leftM = query(root.left, start, end);
                }
            } 
            if (mid < end){
                if (start <= mid){
                    rightM = query(root.right, mid + 1, end);
                }else{
                    rightM = query(root.right, start, end);
                }
            }
            return Math.max(leftM, rightM);
        }
    View Code

    修改

        public void modify(SegmentTreeNode root, int index, int value) {
            // write your code here
            if (root.start == index && root.end == index){
                root.max = val;
            }
            int mid = (root.left + root.right) / 2;
            if (index >= root.start && index <= mid){
                modify(root.left, index, value);
            }
            if (index > mid && index < root.right){
                modify(root.right, index, value);
            }
            root.max = Math.max(root.left.max, root.right.max);
        }
    View Code

     

  • 相关阅读:
    全面了解HTTP和HTTPS(开发人员必备)
    这几款前端必备构建工具合辑,我们帮你整理好了!
    扎心!程序员泪奔的8个瞬间
    Centos7 自定义systemctl服务脚本
    nginx配置优化+负载均衡+动静分离详解
    nginx负载均衡配置
    keepalived高可用反向代理的nginx
    Tomcat相关目录及配置文件
    tomcat快速入门
    基于keepalived双主模型的高可用LVS
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7380728.html
Copyright © 2011-2022 走看看