分治策略
1.遞迴式:
用來描述遞迴求解的分治演算法的執行時間。求解遞迴式有三種方法:
(1)代入法,猜測乙個界,然後用數學歸納法證明這個界是正確的。
(2)遞迴樹法,將遞迴式轉換為一棵樹,利用遞迴式,將每層的代價以及深度都表示出來,節點代表不同層次產生的代價,最後利用邊界和技術求解。遞迴樹法常用來生成乙個好的猜測,然後利用代入法驗證是否正確。
(3)主方法。
求解遞迴式時,我們常忽略向下取整、向上取整以及邊界條件。
2.最大子陣列問題
即求乙個陣列中最大的非空連續子陣列,只有當陣列中包含負值時,此問題才有意義。
問題分解:將陣列分為兩段,最大子陣列所處位置必然是以下三種情況之一:
(1)完全位於子陣列a[low..mid]中
(2)完全位於子陣列a[mid..high]中
(3)跨越中點。
對於前兩種情況,是與原問題相同的子問題,可以遞迴呼叫處理,重點處理第三種情況,然後在三種情況中選最大的。第三種情況也比較好處理,因為有了限制,必須過中點,因此可從中點分別向兩邊找和最大的邊界,即為跨越中點的最大陣列,偽**為:
find-max-crossing-subarray(a,low,mid,high)
left-sum=-∞
sum=0
for i=mid downto low
sum=sum+a[i]
ifsum>left-sum
left-sum=sum
max-left=i
right-sum=-∞
sum=0
for j=mid+1
to high
sum=sum+a[j]
ifsum>right-sum
right-sum=sum
max-right=j
return (max-left,max-right,left-sum+right-sum)
find-maximum-subarray(a,low,high)
if high==low
return(low,high,a[low])
else
mid=(low+high)/2
(left-low,left-high,left-sum)=
find-maximum-subarray(a,low,mid)
(right-low,right-high,right-sum)=
find-maximum-subarray(a,mid+1,high)
(cross -low, cross -high, cross -sum)=
find-max-crossing-subarray(a,low,mid,high)
if left-sum>=right-sum
and left-sum>=cross-sum
return left-low,left-high,left-sum
if right-sum>=left-sum
andright-sum>=cross-sum
return
right-low,right-high,right-sum
if cross-sum>=right-sum
and cross-sum>=left-sum
return cross -low, cross -high, cross –sum
簡化掉一些運算步驟,最大陣列執行時間的遞迴式為:
t(n)=2t(n/2)+θ(n)
3.矩陣乘法的strassen演算法
直接遞迴是將矩陣分為4個矩陣分別進行乘法計算,然後進行相加。strassen演算法是利用數學技巧將乘法轉變為更多的加法計算,從而降低了執行時間,對分治演算法應用感覺比較簡單。
4.主方法求解遞迴式
主定理:令a≥1和b>1是常數,f(n)是乙個函式,t(n)是定義在非負整數上的遞迴式:
t(n)=at(n/b)+f(n)
其中我們將n/b解釋為,那麼t(n)有如下漸進界:
(1)若對某個常數ε>0有f(n)=o(n^log_b〖a-ε〗 ),則t(n)=θ(n^log_ba )。
(2)若f(n)=o(n^log_ba ),則t(n)=θ(n^log_ba logn)。
(3)若對某個常數ε>0有f(n)=o(n^log_b〖a+ε〗 ),且對某個常數c<1和所有足夠大的n有af(n/b)≤cf(n),則t(n)=θ(f(n))。
就是將f(n)與n^log_ba 做比較,如果前者小,並且是多項式意義上小(漸進小於n^log_ba ,相差乙個因子),則對應情況1,如果前者大,並且多項式意義上大,則對應情況3,如果二者相當,則對應情況2。三種情況之間有空隙,並沒有覆蓋所有,因此也有不能採用主方法的情況。
演算法導論(1)
迴圈不變式主要用來理解演算法的真確性 有三個必須證明的性質 初始化 迴圈的第一次迭代之前,它為真,保持 如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真,終止 在迴圈終止時,不變式為我們提供乙個有用的性質,該性質有助於證明演算法是真確的。分析乙個演算法時,需要乙個實現技術的代價,包括描述所用資...
演算法導論學習1
第一章 演算法在計算中的作用 演算法的定義 簡單的說就是定義良好的計算過程,由輸入得到輸出!演算法的作用 應用非常廣泛,許多問題都涉及到演算法!演算法的重要性 是否擁有紮實的演算法知識和技術基礎,是區分真正熟練的程式設計師與新手的一項重要特徵。第二章 演算法入門 學習演算法的目的,不僅僅是很快理解演...
演算法導論筆記 1
略過 2.1 插入排序這種方法類似於數學歸納法,只不過,數學歸納法是無限迭代的,而該方法在for或者while語句停止時,歸納停止,運用這種方法,可以幫我們有條理的證明某演算法在for或while迴圈上正確完備的達到了我們的期望。2.2 分析演算法 演算法的複雜度通常有以下幾種情況 2.3 設計演算...