演算法導論(1)

2021-07-14 15:55:08 字數 2366 閱讀 7334

分治策略

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_b⁡a )。

(2)若f(n)=o(n^log_b⁡a ),則t(n)=θ(n^log_b⁡a log⁡n)。

(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_b⁡a 做比較,如果前者小,並且是多項式意義上小(漸進小於n^log_b⁡a ,相差乙個因子),則對應情況1,如果前者大,並且多項式意義上大,則對應情況3,如果二者相當,則對應情況2。三種情況之間有空隙,並沒有覆蓋所有,因此也有不能採用主方法的情況。

演算法導論(1)

迴圈不變式主要用來理解演算法的真確性 有三個必須證明的性質 初始化 迴圈的第一次迭代之前,它為真,保持 如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真,終止 在迴圈終止時,不變式為我們提供乙個有用的性質,該性質有助於證明演算法是真確的。分析乙個演算法時,需要乙個實現技術的代價,包括描述所用資...

演算法導論學習1

第一章 演算法在計算中的作用 演算法的定義 簡單的說就是定義良好的計算過程,由輸入得到輸出!演算法的作用 應用非常廣泛,許多問題都涉及到演算法!演算法的重要性 是否擁有紮實的演算法知識和技術基礎,是區分真正熟練的程式設計師與新手的一項重要特徵。第二章 演算法入門 學習演算法的目的,不僅僅是很快理解演...

演算法導論筆記 1

略過 2.1 插入排序這種方法類似於數學歸納法,只不過,數學歸納法是無限迭代的,而該方法在for或者while語句停止時,歸納停止,運用這種方法,可以幫我們有條理的證明某演算法在for或while迴圈上正確完備的達到了我們的期望。2.2 分析演算法 演算法的複雜度通常有以下幾種情況 2.3 設計演算...