线段树

线段树:线段树的特点是一般是处理固定大小数组的逻辑,比如指定大小区间的和或者求指定区间内数值的最大值。时间复杂度为O(logn)。如果用循环遍历的话,时间复杂度将会是O(n)。这种数据结构的特点是需要比所需节点更多的内存空间,因为对于树来说,最好的是满二叉树,但是此时只能达到平衡二叉树,所有的叶子节点是数组中的数值。有可能需要一层,也有可能需要两层,所以只能按照两层的树结构进行设计。这个时候需要的内存空间就是4n。因为n = 2的(h-1)次方,此时需要的内存空间大约是2n,但是只要多一个数就得另起一层,这个时候就是4n了。不过面对现在内存大的情况,这个开销可以接受。因为这将带来时间上的加速。
对于如何创建这个线段数,很明显想到的就是递归的算法,通过分析可以发现,当所传入的左右的值相等的时候说明已经遇到了数组的值,也就是达到了线段树的叶子节点,这个时候就开始返回。其实也就是二叉搜索树的后序遍历,只有等所有子树都返回后才进行逻辑操作,也就是对返回的两个值进行自定义的操作,如果是求和就相加。
其实如果求和的话,用额外开辟个数据求每隔一个的和也行,但是此时更新的话是O(n)的时间复杂度,因为改变一个值后需要遍历这个和的数组。所以这个时间线段树就有优势了,因为更新操作的时间复杂度也是O(logn)。因为它只需要递归到最后一个元素,然后向上更新就行了,也就是更新个树的高度。

tips:如果进行查找区间的时候,如果遇到左右子树都需要查找的时候,递归操作的时候,那个想要的区间的值要改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值