浅谈数据结构—分块

数据结构—分块

分块是一种非常好理解、非常好写的数据结构。与其说分块是数据结构,倒不如说它是一种“算法”,甚至是一种“思想”。我个人认为,分块的思想和分治法很像。它们的基本实现方式都可以概括成:将一个大问题拆成若干小问题,最后求解完小问题之后将答案汇总得出大问题的答案。

分块的基本实现是这样的:对于一个长为\(N\)的序列,我们把它拆成\(\sqrt N\)个块,(当然,每块的元素数量当然是\(\sqrt N\)个),我们对每个块进行暴力区间维护。最后就能处理出\(\sqrt N\)个子问题的答案,当我们要统计一个问题区间时,我们就可以统计被这个区间完全覆盖的块的答案,对于个别超出的再进行暴力统计即可。

分块作为一种数据结构,它的实现基于暴力枚举维护。大家可能会想:这个数据结构和暴力枚举有什么区别?但分块和枚举其实是有很大区别的。这是因为分块只需要跑一遍就能处理出所有块的答案,最后统计的时候是按块统计的,而不需要再重新进行暴力。分块的时间复杂度是\(O(NlogN)\)的,我们算一下,就会发现它比暴力枚举快不了太多。事实上,它的确是所有区间统计数据结构中(其他的比如线段树,树状数组等)效率最低的一个,但是它有它自己的优点:易于理解,易于实现。这也是它作为一种实用数据结构存在的原因——当我们在考场上不能百分百保证自己敲出来的高级数据结构(手撸线段树等)正确,那还不如使用简单易写的分块,虽然得不了满分,但在数据构造不刻意卡分块的情况下,对付个60-80分不成问题,RP好一点的甚至可以AC。所以,分块的确是一个简单易学易用的骗分神技小技巧。

猜你喜欢

转载自www.cnblogs.com/fusiwei/p/11432436.html