三、遞迴樹分析法
1 問題
2 解決思路
使用遞迴樹猜想一個上界,使用歸納法證明上界也是下界。
2.1 使用遞迴樹(recursion tree)猜想結論(不嚴謹)
使用遞迴樹兩點:1⃣️逐行展開;2⃣️逐行相加;
逐行展開
本質上是分解問題,每個非葉子結點表示分解+合併問題所付出的代價,葉子結點表示解決邊界問題所付出的代價。
逐層求和
這裡要注意,除去非葉子結點,每一層的和呈現出等比數列性質,計算整個代價 T ( n ) T(n) T(n)本質上就是分解(合併)問題付出的代價+解決遞迴邊界付出的代價。
Case1:
分解問題的代價:
解決遞迴邊界的代價:
Θ
(
n
l
o
g
b
a
)
\Theta(n^{log_ba})
Θ(nlogba)。
取多項式最高次項,因此
T
(
n
)
=
O
(
n
l
o
g
b
a
)
T(n) = O(n^{log_ba})
T(n)=O(nlogba);
Case2:
分解問題的代價:
解決遞迴邊界的代價:
Θ
(
n
l
o
g
b
a
)
\Theta(n^{log_ba})
Θ(nlogba)。
取多項式最高次項,因此
T
(
n
)
=
O
(
n
l
o
g
b
a
l
o
g
b
n
)
T(n) = O(n^{log_ba}log_bn)
T(n)=O(nlogbalogbn);
Case3:
分解問題的代價:
根據假設容易得到
上面的不等號是漸進成立的,所以為了保證對每一個
n
n
n都成立,對於前有限的
n
n
n,要加上每一個都要加上一個足夠大的常數,因此有下面的式子。
解決遞迴邊界的代價:
Θ
(
n
l
o
g
b
a
)
\Theta(n^{log_ba})
Θ(nlogba)。
取多項式最高次項,因此
T
(
n
)
=
O
(
f
(
n
)
)
T(n) = O(f(n))
T(n)=O(f(n));
2.2 使用歸納法證明結論(嚴謹)
上面的遞迴樹分析只是大概得到了一個上界,下面使用數學歸納發證明上屆也是下界。
Case1:
Case2:
Case3:
3 結論
- 先使用非嚴謹的形式分析、猜想,然後用數學歸納法證明,這個思路貫穿整個導論一書;
- 主定理由遞迴樹推出,很多情形不符合主定理的假設,但是遞迴樹+歸納法仍然可以解決,所以整個過程最有價值的是這套分析、證明方法,而非主定理。
- 上面在使用歸納法證明時,漸進符號的威力驚豔了我!
相關文章
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 通用-遞迴樹結構遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 遞迴函式-樹形列表遞迴函式
- 樹遞迴問題的求解遞迴
- php 遞迴一棵樹PHP遞迴
- 遞迴三要素遞迴
- Vue遞迴元件+Vuex開發樹形元件Tree--遞迴元件Vue遞迴元件
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 一道Postgresql遞迴樹題SQL遞迴
- 二叉樹的遞迴套路二叉樹遞迴
- 全域性元件實現遞迴樹,避免迴圈引用元件遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- python 遞迴樹狀結構 和 排序Python遞迴排序
- 遞迴樹形查詢所有分類遞迴
- 二叉平衡樹 python 列表 遞迴Python遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- Java實現遞迴查詢樹結構Java遞迴
- 遞迴判斷是否二叉平衡樹遞迴
- 遞迴和尾遞迴遞迴
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- PHP 樹-不需要遞迴的實現方法PHP遞迴
- js樹型結構資料簡易遞迴JS遞迴
- Day14 | 二叉樹遞迴遍歷二叉樹遞迴
- 二叉樹 遞迴 洛谷P1364二叉樹遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- Golang 遞迴列印楊輝三角Golang遞迴
- 資料結構-樹以及深度、廣度優先遍歷(遞迴和非遞迴,python實現)資料結構遞迴Python
- Vue遞迴元件實現樹形結構選單Vue遞迴元件
- 遞迴遍歷樹狀結構優雅實現遞迴
- Leetcode 題解系列 -- 對稱二叉樹(遞迴)LeetCode二叉樹遞迴
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- 遞迴遞迴