线段树

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 个不同的数
      • 这个用线段树或树状数组就可以做出来,为什么要用划分树这种难写的数据结构呢?
posted @ 2017-11-20 11:20  tmortred  阅读(127)  评论(0编辑  收藏  举报