慕课网liuyubobobo老师课程学习笔记---part8:线段树

本文介绍了线段树的基本概念、表示方法和创建过程,并通过分析LeetCode303和307题,比较了线段树与直接遍历、求和数组法在静态和动态区间查询上的优劣。在面对动态更新需求时,线段树能提供更高效的O(logn)时间复杂度解决方案。
摘要由CSDN通过智能技术生成

1、线段树介绍
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、线段树的基础表示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、创建线段树、线段树区间查询
在这里插入图片描述
  线段树实现的代码如下:

package com.lkj;

public class SegmentTree<E>
{
   
    /*
    使用一个数组表示区间.
    首先,用户可能要获取区间内某一个的元素,或者获取区间的某一个属性,我们在线段树中创建数组,作为区间数组的的副本,用于给出区间数组的某些属性;
    其次,我们想将data数组内的元素(arr数组区间传递进来的)组织成为一个线段树,那么还需要创建一个tree,大小为 4size
    */

    private E[] data;
    //tree结点虽然表示的是一个区间,但是它里面存储的实际上是区间内数据按一定方式计算得到的值。
    // 存储区间只是一种方式,目的还是得到区间内数字通过计算得到的值!
    private E[] tree;
    private Merger<E> merger;

    //初始化的时候传入一个区间数组
    public SegmentTree(E[] arr , Merger<E> merger)
    {
   
        this.merger = merger;

        data = (E[])new Object[arr.length];//使用arr初始化data
        for (int i = 0; i < arr.length ; i++)
        {
   
            data[i] = arr[i];
        }

        tree = (E[])new Object[arr.length * 4];

        //调用 buildSegmentTree() 方法,完成线段树数组tree每一个结点 data数组区间的确定!
        //这样线段树一初始化,它的线段树数组中每一个结点所表示的 data数组的区间也确定了!
        buildSegmentTree(0 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值