【数据结构】二进制分组解决一类强制在线问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hzj1054689699/article/details/83240153

Text

这种技巧来源于论文:许昊然《浅谈数据结构题的几个非经典解法》

你需要对什么东西支持若干个修改和询问操作,强制在线,如果去掉强制在线,那么是可以对时间分治来解决的。

换句话说,这类题目满足能够对于每个修改单独计算对每个询问的答案(修改之间是独立的)
我们将修改操作每2的幂次分一组,每一组用数据结构维护

当出现询问时,就暴力跳每一组,在组中的数据结构查询。
出现新的修改时,就类似2048(逃)一样的向左合并组。

假设当前我们有13个修改操作,组的大小是8 4 1
新加入一个修改,变成8 4 1 1
合并就变成 8 4 2
以此类推。

合并组的时候就暴力重构这个数据结构

分析这样的时间复杂度
论文中如是说

考虑我们加入第k个操作所需要重构的组的大小
可以发现其实就是 l o w b i t ( k ) lowbit(k)
假设我们维护每一组的数据结构的复杂度为 O ( f ( s i z e ) ) O(f(size))
组数一定是不超过 log k \log k 组的,那么总的询问时间复杂度就是 O ( q log n f ( n ) ) O(q\log n*f(n))
总的修改时间复杂度就是 i = 1 n O ( f ( l o w b i t ( k ) ) ) \sum\limits_{i=1}^{n}O(f(lowbit(k)))
= i = 1 log n O ( n 2 i + 1 f ( 2 i ) ) =\sum\limits_{i=1}^{\log n}O\left(\left\lceil{n\over 2^{i+1}}\right\rceil *f(2^i)\right)
i = 1 log n O ( f ( i ) ) = O ( f ( n ) log n ) \leq\sum\limits_{i=1}^{\log n}O(f(i))=O(f(n)\log n)

猜你喜欢

转载自blog.csdn.net/hzj1054689699/article/details/83240153
今日推荐