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

    Basic Topic

    Intro

    • 线段树:本质上将每个局部的计算结果保留下来,在需要的时候通过少量的操作就可以获取到最终的结果。因为 2 分组合是最佳的方式, 所以用二叉树建立线段树
    • 目前遇到的线段树分为 2 种:一种按照输入数据的值域来建的树, 另外一种按照输入数据的个数(即位置)

    线段树适合解决什么问题

    • 区间更新

      • lazy 更新的方式,只在根节点记录需要加减多少
      • 每个字节的存放的是和父节点的差值
    • 查询区间内最大值, 最小值,sum 和等

      • 如果要查询 区间内的 第 k 大值就需要做特殊处理(最大值具有偏序性, 即求父节点的最大值只要得知两个字节点的最大值。但是某个节点上第 k 大值不能通过 2 个子节点上第 k 大值获取)
    • 很特别的问题

      • 线段树能快速解决 (leetcode 上求存水量的问题),但是没有 尺取法快

    线段树 vs 树状数组

    Advanced Topic

    树套树

    二分思想(线段树, 二叉树,跳表)

    划分树

    • 区间 Kth Number
    • 也可以用求区间内不同数的个数
      • 输入参数 1 5 6 3 8 8 4 2 , 求 2 ~6 区间有多少个不同的数? 因为 2~6 区间第 4 大的数是 8, 第 5 大的数也是 8, 所以得出 2~6 区间有 4 个不同的数
        • 这个用线段树或树状数组就可以做出来,为什么要用划分树这种难写的数据结构呢?
  • 相关阅读:
    第11次作业
    第十次实验
    第九次作业
    第八次实验
    第七次作业
    第六次作业
    作业
    JAVA实验三
    JAVA实验二
    JAVA实验一
  • 原文地址:https://www.cnblogs.com/tmortred/p/7865467.html
Copyright © 2011-2022 走看看