线段树和树状数组的认识与总结

线段树(Segment Tree)和树状数组(Binary Indexed Tree)具有相似是结构特点,都是以二叉树作为基础进行数据运算,都是擅长处理区间上的数,不同的是线段树的每个节点维护的是对应区间的最小值,所以善于处理区间上的最小值,而树状数组的节点维护的是对应区间的数的和,所以更善于处理区间和。

线段树的主要操作为2种:1、给定s和t,求其区间上的最小值;2、给定i和x,把ai的值改成x。

线段树中左右儿子的下标分别为2*i+1和2*i+2。

在求最小值的操作中,在一个大区间里进行递归,现在的区间在要求的区间中时返回现在区间的最小值,否则继续递归知道把所有的所求区间的范围都走一遍。

在更换值以后需要对线段树进行更新,自下往上直到父亲节点的数值要比该数要小。

树状数组的主要操作也是两种:1、给定i,计算a1...ai的和;2、给定i和x,执行ai+=x。

树状数组中比较巧妙的是在于BIT中的只保留左儿子的规定,这让树状数组的区间和更加方便操作。但也是因为树状数组的结构问题只能求从头到一个位置的上的和,但可以通过做减法求任意区间的和。

线段树和树状数组在复杂度上同级,较其他一些算法要低。,

树状数组的常数明显优于线段树,其编程复杂度也远小于线段树。但其作用可以被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树都基本可以解决, 但是线段树能够解决的问题树状数组未必能够解决。树状数组的突出特点是其编程的极端简洁性, 使用lowbit技术可以在很短的几步操作中完成树状数组的核心操作,因而其代码效率远高于线段树。另外,当问题推广到高维情形时高维树状数组比高维线段树有着更多常数优势。

 

以上为我对线段树和树状数组的认识和总结。

你可能感兴趣的:(线段树和树状数组的认识与总结)