今年xhr大神的論文有很大一部分內容是cdq分治及其擴展(也就是二進制分組),拜讀後覺得還是蠻有用的,這裏小小地總結一下。(話說自己草稿箱裏還有好多學習筆記的半成品呢,真是弱爆了。順便感謝下ydf向我介紹了那麼好的東西)
推薦論文:
1 《從<Cash>談一類分治算法的應用》 陳丹琦
2 《淺談數據結構題的幾個非經典解法》 許昊然
Q: cdq分治和普通的分治有什麼區別?
A: 在我們平常使用的分治中,每一個子問題只解決它本身(可以說是封閉的)。而在cdq分治中,對於劃分出來的兩個子問題,前一個子問題用來解決後一個子問題而不是它本身。
在很多問題中(比如大多數數據結構題),我們經常需要處理一些動態問題。然而我們對動態問題的處理總是不如靜態問題來的那麼方便,於是就有了cdq分治。但正如論文2所提到的,使用這算法的前提是問題必須具有以下兩個性質:
1.修改操作對詢問的貢獻獨立,修改操作互不影響效果。
2.題目允許使用離線算法。
具體算法流程如下:
1.將整個操作序列分爲兩個長度相等的部分(分)
2.遞歸處理前一部分的子問題(治1)
3.計算前一部分的子問題中的修改操作對後一部分子問題的影響(治2)
4.遞歸處理後一部分子問題(治3)
在整個流程中,最核心的就是步驟3:因爲前一部分子問題中的修改操作相對後一部分子問題來說是靜態處理,所以我們就可以更加方便地計算後一部分子問題。