dp进阶之FFT加速+数据结构优化+不等式优化
快速傅里葉變換
快速傅里葉變換(英語:Fast Fourier Transform, FFT),是快速計算序列的離散傅里葉變換(DFT)或其逆變換的方法。傅里葉分析將信號從原始域(通常是時間或空間)轉換到頻域的表示或者逆過來轉換。FFT會通過把DFT矩陣分解為稀疏(大多為零)因子之積來快速計算此類變換。?因此,它能夠將計算DFT的復雜度從只用DFT定義計算需要的??,降低到??,其中???為數據大小。
快速傅里葉變換廣泛的應用于工程、科學和數學領域。這里的基本思想在1965年才得到普及,但早在1805年就已推導出來。?1994年美國數學家吉爾伯特·斯特朗把FFT描述為“我們一生中最重要的數值算法”,它還被IEEE科學與工程計算期刊列入20世紀十大算法
庫利-圖基快速傅里葉變換算法(Cooley-Tukey算法)是最常見的快速傅里葉變換算法。這一方法以分治法為策略遞歸地將長度為N?=?N1N2的DFT分解為長度分別為N1和N2的兩個較短序列的DFT,以及與旋轉因子的復數乘法。這種方法以及FFT的基本思路在1965年J. W. Cooley和J. W. Tukey合作發表An algorithm for the machine calculation of complex Fourier series之后開始為人所知。但后來發現,實際上這兩位作者只是重新發明了高斯在1805年就已經提出的算法(此算法在歷史上數次以各種形式被再次提出)。
庫利-圖基算法最有名的應用,是將序列長為N的DFT分區為兩個長為N/2的子序列的DFT,因此這一應用只適用于序列長度為2的冪的DFT計算,即基2-FFT。實際上,如同高斯和庫利與圖基都指出的那樣,庫利-圖基算法也可以用于序列長度N為任意因數分解形式的DFT,即混合基FFT,而且還可以應用于其他諸如分裂基FFT等變種。盡管庫利-圖基算法的基本思路是采用遞歸的方法進行計算,大多數傳統的算法實現都將顯示的遞歸算法改寫為非遞歸的形式。另外,因為庫利-圖基算法是將DFT分解為較小長度的多個DFT,因此它可以同任一種其他的DFT算法聯合使用。
快速傅里葉變換是一個很有工程價值的算法,廣泛地應用于音頻、圖像等數字信號處理軟件中。傅里葉變換本身的理論很深,這里僅以快速多項式乘法為例介紹它在算法競賽中的應用。快速傅里葉變換(FFT)是用來計算離散傅里葉變換(DFT)及其逆變換(IDFT)的快速算法。DFT把時域信號變換為頻域信號。時域和頻域只是兩種信號分析的方法,并不是指兩種不同類別的信號。DFT有一個很有意思的性質:時域卷積,頻域乘積;頻域卷積,時域乘積;如果你不知道什么是卷積(convolution),也沒關系,請記住:多項式乘法實際上是多項式系數向量的卷積。
多項式乘法。給定兩個單變量多項式A(x),B(x),次數均不超過n,如何快速計算二者的乘積呢?最簡單的方法就是把系數兩兩相乘,再相加。這樣計算的時間復雜度是 O(n^2),當n很大時,速度會很慢。注意,高精度整數的乘法是多項式乘法的特殊情況,所以多項式乘法的快速乘法也可以用來做高精度乘法。
上述算法之所以慢是因為表示方法不好。雖然”系數序列“是最自然的表示方法,但卻不適合用來計算乘法。在多項式快速乘法中,需要用點值法來表示一個多項式,點值表示一個”點—值“對的序列{(x0,y0),(x1,y1).......(x(n-1),y(n-1))},它代表一個多項式,點值法非常適合做乘法:只要兩個多項式的點集{ xi }相同,則只需要把對應的值乘起來就可以了,只需要O(n)時間。但問題在于輸入輸出的時候仍需要采用傳統的系數表示法,因此需要快速地在系數表示和點值表示之間轉換。還記得上面那句話嗎?時域卷積,頻域乘積;也就是說,多項式的系數表示法對應于時域,而點值表示法對應于頻域。因此,只需要用FFT計算出一個DFT,就可以完成轉換。
單位根。這樣算出來的點值表示法,對應的求值點是那些?答案是2n次單位根。所謂”n次單位根“,是指滿足x^n=1的復數。在復數域,1恰好有n個單位根e^(2k*PI*i / n),其中i是虛數單位,e^(iu)=cos u+i*sin u.單位根非常特殊,因此FFT才可以在更短時間內求出多項式在這些點的取值。
利用FFT進行快速多項式乘法的步驟:
1.補0:在兩個多項式的最前面補0,得到兩個2n次多項式,設系數向量分別是V1和V2
2.求值:用FFT計算 f1=DFT(v1)和 f2=DFT(v2).這里的f1和f2分別是兩個輸入多項式在2n次單位根處的各個取值(即點值表示)
3.乘法:把兩個向量f1和f2的每一維對應相乘,得到向量f。它對應多項式乘積的點值表示
4.插值:用FFT計算v=IDFT(f),其中n就是乘積的系數向量
多項式求值算法
給定多項式:A(x)=a0+a1*x+a2*x^2+a3*x^3+......+a(n-1)*x^(n-1)
設x為1的2n次方根,對所有的x計算A(x)的值
算法1:對每個x做下述運算,依次計算每個項 ai*x^i,(i=0,1,2,3....n-1),然后對 ai*x^i(i=0,1,2,3....n-1)求和
每一項都需要重新計算,時間復雜度是O(n^3)
算法2:依次對x做下述運算,減少不必要的重新計算,A1(x)=a(n-1),
數據結構優化
有時盡管狀態找好了,轉移方程的想好了,但時間復雜度比較大,需要用數據結構進行優化。常見的優化有二進制優化、單調隊列優化、斜率優化、四邊形不等式優化等。
1、二進制優化
主要是優化背包問題,背包九講里面有介紹,比較簡單,這里只附上幾道題目。
hdu 1059 Diving?
hdu 1171 Big Event in Hdu
poj 1048 Follow My Magic
2、單調隊列優化
推薦論文:http://wenku.baidu.com/view/4d23b4d128ea81c758f578ae.html
推薦博客:http://www.cnblogs.com/neverforget/archive/2011/10/13/ll.html
hdu 3401 Trade??
poj 3245 Sequece Partitioning?二分+單調隊列優化
3、斜率優化
推薦論文:用單調性優化動態規劃
推薦博客:http://www.cnblogs.com/ronaflx/archive/2011/02/05/1949278.html
hdu 3507 Print Article
poj 1260 Pearls
hdu 2829 Lawrence
hdu 2993 Max Average Problem
4、四邊形不等式優化
推薦博客:http://www.cnblogs.com/ronaflx/archive/2011/03/30/1999764.html
推薦博客:http://www.cnblogs.com/zxndgv/archive/2011/08/02/2125242.html
hdu 2952 Counting Sheep
poj 1160 Post Office
hdu 3480 Division
hdu 3516 Tree Construction
hdu 2829 Lawrence
四邊形不等式優化
今天第一次學習四邊形不等式優化dp,感覺優化效果十分給力,不過數學味道比較濃重,證明比較復雜。因此這里刪繁就簡,給出關于四邊形不等式優化必須要明白的地方,以后直接套用條件即可。
四邊形不等式優化條件
1.在動態規劃中,經常遇到如下式的狀態轉移方程:
m(i,j) = min{?m(i,k-1),m(k,j) } + w(i,j)? (i<=k<=j) (min也可以改為max)
m(i,j) 表示在【i,j】區間上的某個最優值,w(i,j)表示轉移時需要付出的代價,該方程的時間復雜度為O(n^3).
2.下面我們用四邊形不等式來優化上述方程:
(1)區間包含的單調性
如果對于 i <= i' < j <= j',有w(i' , j) <= w(i , j')?,那么說明 W 具有區間包含的單調性。
(形象的理解為如果小區間包含于大區間,那么小區間的w值不超過大區間的w值)
(2)四邊形不等式
如果對于 i <= i' < j <= j' ,有 w( i , j ) + w( i' , j' ) <= w ( i , j' )+w( i' , j' )?,我們稱函數w滿足四邊形不等式
(形象的理解為兩個交錯區間的和不超過小區間與大區間的和)
兩個定理:
定理一:如果W函數同時滿足區間包含的單調性和四邊形不等式,那么函數m也滿足四邊形不等式
我們再定義S(i,j)表示m(i,j)取得最優值時對應的下標,(即 i<= k <= j 時,k處的w值最大,則s(i,j)=k )
此時有如下定理:
定理二:假如 m(i,j)滿足四邊形不等式,那么s(i,j)單調,即 s(i,j) <= s(i,j+1) <= s(i+1,j+1)
有了上述兩個定理后,如果w函數滿足區間包含單調性和四邊形不等式性質,那么有s(i,j-1) <= s(i,j) <= s(i+1,j)
原來的狀態轉移方程可以改寫為下式:
m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)? ?(min也可以改為max)
由于這個方程枚舉的是區間長度L=j-i,而s(i,j-1)和s(i-1,j)的區間長度為L-1,是之前已經計算過的,可以直接調用。不僅如此,區間的長度最多有n個,對于固定的長度L,不同的狀態也有n個,故時間復雜度為O(n^2),而原來的復雜度為O(n^3),實現了四邊形不等式的優化。今后只需要根據方程的形式,以及w函數是否滿足上述兩條性質,即可考慮使用四邊形不等式來優化。
?
總結
以上是生活随笔為你收集整理的dp进阶之FFT加速+数据结构优化+不等式优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01背包问题+完全背包问题+多重背包问题
- 下一篇: 单源最短路 Dijkstra算法 和