求解区间问题的三种做法的区别 线段树、树状数组、RMQ

时间:2022-04-26 04:22:58

树状数组主要用于计算区间的和,在区间元素修改值的时候能够快速修改而不是以O(n)的复杂度进行修改;

线段树是把区间以树的形式分拆为若干个小区间,每个小区间存的都有一个值(树状数组的元素存的是区间值),所以线段树可以快速获得这个区间里面的所有的节点(元素),主要用于计算每个区间的最大最小元素(也可以快速修改区间元素的值)

RMQ是用数组的形式存储元素的值,用二分的方法进行计算区间的最大最小值,所以他比较快!但是有个缺点就是每一次修改区间的元素都会影响其最终结果,就是每一次修改都要进行一次RMQ,所以修改的时候很复杂!

所以如果单纯的计算差点问线或者插线问点用树状数组,如果单纯的求固定区间(即区间的元素无修改)的最大最小值用RMQ!

如果既求某一区间的最值(或区间和)且又修改值就用线段树!

如果求区间和且在一定范围内修改区间值可以考虑树状数组做法,参考本人博客: