三、遞迴樹分析法
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遞迴
- 二叉樹遞迴練習二叉樹遞迴
- 全域性元件實現遞迴樹,避免迴圈引用元件遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- 遞迴樹形查詢所有分類遞迴
- 二叉樹非遞迴遍歷二叉樹遞迴
- Swift遞迴列舉與紅黑樹Swift遞迴
- Mysql 實現樹狀遞迴查詢MySql遞迴
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 二叉平衡樹 python 列表 遞迴Python遞迴
- Java實現遞迴查詢樹結構Java遞迴
- python 遞迴樹狀結構 和 排序Python遞迴排序
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 遞迴和尾遞迴遞迴
- Golang 遞迴列印楊輝三角Golang遞迴
- PHP 樹-不需要遞迴的實現方法PHP遞迴
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- 樹(2)--二叉樹的遍歷(非遞迴)+線索二叉樹二叉樹遞迴
- 關於樹型結構資料遞迴查詢,轉非遞迴查詢的實現遞迴
- Vue遞迴元件實現樹形結構選單Vue遞迴元件
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 資料結構之二叉樹遞迴操作資料結構二叉樹遞迴