考虑这样一个问题:k个人排列在一起,每个人的财富值会变化,求连续x人的财富值总和(或者最大值)
直接遍历区间去进行处理,在操作次数多的时候,会比较慢。
这样的数据,可以建立索引么?
线段树就是这样的索引结构。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
对原始数据区间进行一分为二的组织架构,这样总的树深度是lgN,每次数据修改,也去修改相应的索引值,在进行区间操作的时候,从上到下去查找,利用已有的区间索引值来替代遍历操作。
如果区间比较小,比如大小为2,这个时候,可以遍历区间,不去使用索引结构。
这种树结构,看上去和堆排序有些相似,其实也可以用来实现堆排序求前k大的数据,在整个区间找到最大的数后,将其变为一个标记数,如0,再更新索引数据,就可以得到新的最大值。
对于求逆序对个数的问题,也可以转换为区间求值问题来使用线段树。
参考资料: