学习笔记: cdq分治

来源:互联网 发布:数据检索 编辑:程序博客网 时间:2024/05/01 09:51


今年xhr大神的论文有很大一部分内容是cdq分治及其扩展(也就是二进制分组),拜读后觉得还是蛮有用的,这里小小地总结一下。(话说自己草稿箱里还有好多学习笔记的半成品呢,真是弱爆了。顺便感谢下ydf向我介绍了那么好的东西)



推荐论文:

1 《从<Cash>谈一类分治算法的应用》 陈丹琦

2 《浅谈数据结构题的几个非经典解法》  许昊然



Q: cdq分治和普通的分治有什么区别?

A: 在我们平常使用的分治中,每一个子问题只解决它本身(可以说是封闭的)。而在cdq分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身。



在很多问题中(比如大多数数据结构题),我们经常需要处理一些动态问题。然而我们对动态问题的处理总是不如静态问题来的那么方便,于是就有了cdq分治。但正如论文2所提到的,使用这算法的前提是问题必须具有以下两个性质:

1.修改操作对询问的贡献独立,修改操作互不影响效果。

2.题目允许使用离线算法。


具体算法流程如下:

1.将整个操作序列分为两个长度相等的部分(分)

2.递归处理前一部分的子问题(治1)

3.计算前一部分的子问题中的修改操作对后一部分子问题的影响(治2)

4.递归处理后一部分子问题(治3)


在整个流程中,最核心的就是步骤3:因为前一部分子问题中的修改操作相对后一部分子问题来说是静态处理,所以我们就可以更加方便地计算后一部分子问题。

原创粉丝点击