演算法 之 分治 合併排序 小結

2021-08-31 08:12:32 字數 1336 閱讀 8511

之前我們看過的演算法 bottomupsort 和 mergesort,前者是迭代的,而後者是遞迴的。

在這裡我們可以思考一下,既然能夠利用演算法 bottomupsort,為什麼還要借助於像 mergesort 那樣的遞迴演算法呢?尤其是考慮到因使用棧而需要的額外空間數,以及由處理遞迴呼叫內在開銷帶來的額外空間。

而且從實踐的觀點來看,似乎沒有理由贊成用遞迴演算法替代其等價的迭代演算法。

但是從理論的觀點來看,遞迴演算法具有對問題易於敘述、領會和分析等優點。為了理解這一點,我們可以對演算法 mergesort 和 bottomupsort 的**作比較,很明顯後者需要花更多的時間除錯和理解**的含義。

這啟示我們設計演算法可以從遞迴描述的框架著手,如果可能,以後再將演算法改進並轉化為乙個迭代的演算法。

每個遞迴演算法總是可以被轉換為迭代演算法的,而且兩者在解決問題每個例項時他們的功能是完全相同的。

點這裡檢視 buttomupsort

點這裡檢視 mergesort

最後再用著名的 fibonacci 序列來稍微比較一下遞迴和迭代所耗費的時間。

在數學上,fibonacci 序列是用遞迴來定義的,它的性質如下所示:

f0 = 0f

1 = 1f

2 = 1f

3 = 2f

4 = 3f

5 = 5.

..fn = f

n-1 + f

n-2

我們可以用 遞迴 和 迭代 兩種方法來求解 fibonacci(n) 的值,然後非常直觀地比較這兩種方法所耗費的時間。

以下這兩個方法到了 index=140 的時候,會因為計算結果超過 decimal 型別的最大值而丟擲異常

public static decimal fibonacciiteration(int index)

return sum;}}

}) = ",

i, fibonacci.fibonacci.fibonacciiteration(i));}}

catch (exception ex)

try) = ",

i, fibonacci.fibonacci.fibonaccirecursion(i));}}

catch (exception ex)

console.readkey();}}

}程式執行截圖

執行程式時,可以非常直觀的察覺到用迭代方法來計算,結果都是瞬間計算出來的,

而遞迴算得卻很慢,特別是當 index=33-35 時,幾乎要花掉1秒鐘來計算,而且越到後面需要的時間更是成指數增長

演算法篇之分治演算法 歸併排序

分治演算法 分治 把乙個任務分成形式和原任務相同,但規模更小的幾個部分任務 通常是兩個部分 分別完成,或只需要選一部分完成。然後再處理完成後的這乙個或幾個部分的結果,實現整個任務的完成。例題1 歸併排序 陣列排序任務可以如下完成 a.把前一半排序 b.把後一半排序 c.把兩半歸併到乙個新的有序陣列,...

分治演算法之合併排序

合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列 1 分解 將待排序元素分成大小大致相同的兩個子串行 2 治理 對兩個子串行進行合併排序 3 合併 將排好序的有序子串行進行合併,得到最終的有序序列 合...

分治演算法(二)合併排序

1.問題分析 合併排序問題給定的是乙個無序的序列,可以把待排序的元素分解為兩個規模大致相等的子串行。如果還是不容易解決就繼續將子串行分解,直到子串行中的元素個數為1,因為單個元素的序列本身是有序的,此時便可以進行合併,從而得到乙個完整的有序序列。2.演算法設計 1 分解 將待排序元素分成大小大致相同...