线段树

线段树

2018-12-04  本文已影响0人  YellowTag

参考网址:https://www.jianshu.com/p/91f2c503e62f


实际上上面的那个教程已经说得很清楚了,这里我就只给我自己的见解和总结

使用线段树的原因

原来的需求是在某个区间范围内求和,或者给出这个区间范围内的最大值

如果按照朴素的查询,查询的时间复杂度是O(n),而如果给出m次查询,那么时间复杂度便是O(mn)

如果使用线段树,那么建树的复杂度是O(n),但查询的时间复杂度是O(lgn)(以2为底)

分析时间复杂度

构建线段树的时间复杂度

O(n)

分析:
可以推导出构建一棵树的递归方程是T(n)=2T(n/2)+R
其中R是一个时间常数
可以试着在图上画出这个线段树,可以计算出树的高度是 log2(n)
那么按照常规来,第一个节点的时间是T(n)+R
然后我们再将T(n)分摊给他的两个子节点,可以推出
T(n)=2T(n/2)+R
如此迭代下去,可以推出T(n)

T(n)=R+2R+4R+....+R2x-1

然后这个数列的长度是log2(n)
根据等比数列求和
可以算出T(n)=(n/2-1)R
那么时间复杂度就是O(n)

查询的时间复杂度

  • 首先假设数组区间是[1,17],我们要求的区间是[2,15]
  • 那么第二层我们就要考虑[1,9][10,17]
  • 假设先考虑[1,9],那么往下走就分为了[1,5][6,9]
    这两个区间都和[2,15]有交集,但是[6,9]是已知了的(整个都在[2,15]里面),所以我们只要继续考虑左边的[1,9]就好了
  • 就这样我们就能看出一层我们最多只会考虑到两个节点

参考: https://stackoverflow.com/questions/27185066/segment-tree-time-complexity-analysis

上一篇下一篇

猜你喜欢

热点阅读