遞迴與分治策略

2021-06-16 04:43:48 字數 1469 閱讀 1495

1、全排列問題:設r(n)=是要進行排列的n個元素。集合x中元素的全排列記為perm(x)。求r(n)的全排列perm(r(n))。

用遞迴演算法求解:

(1)找出遞迴子結構性質:即原問題的解包含了子問題的解,且子問題的描述與原問題相同。這就可以用子問題的解來構造原問題的解。設r(i)=r(n)-,這是乙個子問題。設(r[i])perm(x)表示在全排列perm(x)的每乙個排列前加上字首r[i]得到的排列。則perm(r(n))由(r[1])perm(r(1)),(r[2])perm(r(2)),...,(r[n])perm(r(n))構成。這樣我們就用子問題的解定義出原問題的解,只不過這裡用的是多個子問題的解,很多簡單的問題只用乙個子問題的解就可定義原問題的解,比如常見的用f(n-1)定義f(n)。

(2)找出遞迴終止條件:設計遞迴演算法時必須要有遞迴終止條件,否則就不能使用遞迴演算法來求解。終止條件必須是乙個不再依賴於子問題的可計算出的值。這裡n=1時遞迴終止,這時集合中只有乙個元素,因此perm(r(1))=,不再依賴於子問題了。

演算法遞迴地產生所有字首是r[0]r[1]...r[k-1],字尾是r[k]...r[m]的全排列。演算法將r[k]~r[m]中的每乙個元素與r[k]交換,然後遞迴地計算r[k+1]~r[m]的全排列,並將結果作為r[0]...r[k]的字尾。呼叫perm(r,0,n-1)即得原問題的解。

2、整數劃分問題:將乙個正整數n表示成一系列正整數之和,n=n[1]+n[2]+...+n[k],其中n[1]>=n[2]>=...>=n[k]>=1,k>=1。正整數n的乙個這種表示稱為n的乙個劃分。求n的不同劃分個數。

用遞迴演算法求解:

(1)遞迴子結構性質:顯然n的乙個劃分中包含了某個子問題t(m>1時,n[1]不大於m的劃分,由n[1]<=m-1的劃分和n[1]=m的劃分組成,q(n,m)=q(n,m-1)+q(n-m,m)。

(2)遞迴終止條件:上述1),2),3)即為遞迴的終止條件。在分析遞迴終止條件時特別注意要使所有的子問題都能遞迴終止,否則如果某個子問題不能遞迴終止,會導致無窮的遞迴呼叫。

這裡random(p,r)產生p和r之間的乙個隨機整數,且產生不同整數的概率相同。

(2)子問題求解:由於用兩個子問題來定義原問題,完成了遞迴定義,因此可直接對兩個子問題進行遞迴求解,這裡的問題求解就是對陣列進行排序。p=r時遞迴終止,直接返回a[p]。

(3)合併子問題的解:由於排序是就地進行的,在兩個子問題都排好序時無需執行任何合併操作,原問題就已經排好序,然後直接返回第k小的元素即可。在歸併排序中就有對子問題解的合併過程。

可以證明這個分治演算法的平均執行時間為o(n),在最壞情況下則為o(n**2),例如在找最小元素時總是在最大元素處劃分。

遞迴演算法基本思想:找出遞迴子結構性質(原問題的解包含了子問題的解)、用子問題的解來遞迴定義原問題的解、找出遞迴終止條件。

分治法基本思想:問題分解(分解成k個規模大致相同的子問題)、子問題遞迴求解、合併各個子問題的解。

遞迴與分治策略

1.遞迴 直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。1 階乘函式 include using namespace std int main int factorial int n 2 fibonacci數列 include using namespace st...

分治策略與遞迴

先看 資料結構與演算法分析 中對分治策略的解釋 把問題分成兩個大致相等的子問題,然後再遞迴地對他們進行求解,這是 分 治 階段將兩個子問題的解合併到一起並可能再做些少量的附加工作,最後得到整個問題的解。由定義可以看出,分治需要進行兩步操作 分 將問題恰當的劃分為需要迭代處理的兩個子問題,治 將兩個子...

遞迴與分治策略

輸出最長公共子串 lcs 二維陣列veca記錄的是兩個字串xi和yj的lcs長度 int lcs length const string str1,const string str2,vector veca,vector vecb for j 0 j str2.length j for i 1 i ...