1. 程式人生 > >分治演算法中的可優化點(三)

分治演算法中的可優化點(三)

    但是,經過觀察和演算,設計M1,M2,…,M7,對應7個子問題:


    矩陣的Coppersmith-Winograd演算法目前最好的,上界是O(n^2.376),矩陣乘法作為一項基礎的運算其應用廣泛,例如:科學計算,影象處理,資料探勘,迴歸、聚類、住成分分析、決策樹等挖掘演算法涉及大規模矩陣運算。

    這個策略可能會使劃分和合並子問題的工作量d(n)增加,但增加的工作量不影響W(n)的階。

途徑二:降低d(n)的階,增加預處理

    增加預處理幹什麼?有毛用?在分治之前,可以通過預處理一些資料來降低d(n)的階,使得每次遞迴的時候d(n)不會帶來一些過多的時間開銷。

例:一個幾何計算中的例子,找出一塊平面點集P內的最近點對,設有n個點,n>1

    普通演算法:在所有點中依次不重複地選擇一對點計算距離,然後比較大小,得到最小距離的一對點,時間複雜度為組合數C(n,2)=n(n-1)/2,O(n^2)

分治演算法的大致思路:

  1. 將P劃分為大小均等的2個點集PL,PR
  2. 分別遞迴計算點集PL,PR的最近點對
  3. 計算PL,PR各出一點組成的最近點對
  4. 綜合2,3兩種情況裡的最近點對

    當n=10時的一個可能樣圖,垂直x軸的紅色垂線是一個可能的劃分,如下:


演算法的偽碼錶示:

輸入:點集P,X為所有點的x座標陣列,Y為所有點的y座標陣列

輸出:最近的兩個點以及距離

    minDistance(P,X,Y)

  1. 若|P|<=3,直接計算其距離
  2. 排序X,Y
  3. 用中垂線l將P分為PL,PR
  4. δl = minDistance(PL,XL,YL)
  5. δr = minDistance(PR,XR,YR)
  6. δ=min{δl , δr }
  7. 計算距離中垂線l兩側不超過δ的帶狀平面內的點集的最近點對,若小於δ,則以其改之。

    第7步有點玄乎,有疑義,估計有改進的地方,下面來看看怎麼處理比較好,先看一張圖:


    上圖中說明了,圖中的點只和綠色區域所圈的點比較,和除此之外的點比較沒有意義,因為除此之外的點一定大於第6步確定的δ,那麼綠色區域是怎確定的呢?寬δ是距離中線的長度,2δ是以圖中點的y座標為準,上漲δ下垂δ包括邊界而來,所以在與異側的點計算距離的時候,只選取在綠色區域內的點計算即可,若果圖中Y座標向上為正值增大方向的話,即圖中的點只和異側y座標不超過y+δ的點進行計算,又因為每次傳入的Y陣列會被排序,所以一次從Y陣列中確定y座標不超過y+δ的6個連續的點來進行計算,當然排序後的X,Y陣列有一個對應關係序列,為什麼6個點?上圖中已經說得很明白。

時間複雜度分析:

  • 步1 最小子問題的求解:O(1)
  • 步2 排序:O(nlgn),數量大時使用快速排序好點
  • 步3 劃分:O(1)
  • 步4-5 分解成子問題處理:2T(n/2)
  • 步6 比較:O(1)
  • 步7 計算帶狀平面內的點集的最近點對:O(n),帶狀區域被中垂線一分2半,一半的點最多n/2個,而且每個點的計算距離次數是6次,則帶狀區域裡計算最近點對的時間複雜度是O(6*n/2) = O(n)

    所以綜上所述的時間複雜度有:T(n)= 2T(n/2)+O(nlgn),T(2)=T(3)=O(1),因為O(1)+O(nlgn)+ O(1)+ O(1) +O(n)= O(nlgn);對以上遞推式進行遞迴樹求解有T(n)=O(n(lgn)^2),比較普通演算法,有了改進,但還是沒有到本講的精華部分。

    我們看到每次遞迴都會 對X,Y進行排序,成為了d(n)的主要“貢獻”部分。我們把可以把對X,Y整體的排序放到分治之前來做一次對X,Y的排序,劃分的時候,點集P一分為二PL,PR;X從中一分為二XL,XR;而Y的劃分通過如下偽碼:


時間複雜度分析:

    和改進前的分析一樣,只是步2換成了對有序陣列的拆分,這個工作量是O(n),預處理的工作量是O(nlogn),所以總的時間複雜度W(n)=T(n)+O(nlogn),T(n)=2T(n/2)+O(n),T(2)=T(3)=O(1),遞推式求漸進解有T(n)=O(nlogn),所以總的時間複雜度W(n)=O(nlogn)+ O(nlogn),故,W(n)= O(nlogn),比較改進前的O(n(lgn)^2)要好了很多。

    我們把結子放在這裡吧,看了這麼多例子,也不囉嗦了。

分治演算法總結:

  • 劃分時要均衡
  • 子問題與原問題具有相同的性質,可以用來遞迴
  • 遞迴與迭代實現
  • 注意遞迴的邊界
  • 通過遞推方程來分析時間複雜度
  • 對於滿足主定理的第一個結論的條件的遞推式,可以通過減少子問題的個數來優化演算法
  • 增加預處理,降低綜合解時的開銷