1.遞迴演算法的時間複雜度:
master公式的使用:t(n)=a*t(n/b)+o(n^d) master公式的適用範圍:劃分的子過程規模是一樣的情況下,只是發生了a次,這種情況下才能運用master來求解。
(1)log(b,a)>d --->複雜度為o(n^log(b,a))
(2)log(b,a)=d --->複雜度為 o(n^d*logn)
(3)log(b,a)複雜度為o(n^d)
2.接下來通過遞迴的方法求出乙個陣列中的最大值
publicclass
test2 ;
system.
out.println(getmax(arr,0,arr.length-1
)); }
public
static
int getmax(int arr,int l,int
r)
int mid = (l+r)/2
;
int maxleft =getmax(arr,l,mid);
int maxright= getmax(arr,mid+1
,r);
return
math.max(maxleft,maxright);
}}
3.演算法分析:
(1)主函式:getmax(arr,0,3)。遞迴函式就是系統在幫你壓棧的操作。所謂的遞迴函式就是系統棧。任何遞迴行為都可以改成非遞迴。
(2)t(n)=at(n/b)+o(n^d) t(n)表示樣本量為n的情況下的時間複雜度。該式是估計遞迴行為時間複雜度的通式。n/b代表的是子過程的樣本量,子問題的樣本量要比原始問題的樣本量要小,對於本問題,所有子過程的樣本量都是n/2,發生了2次,出去遞迴過程之外,剩下的就是進行比對了,所以時間複雜度就是o(1)。於是在b=2,a=2,d=0的時候的式子就是:t(n)=2t(n/2)+o(1)。只要滿足上面式子的,可以通過上述規律求出時間複雜度。這裡的d是0,a是2,b是2,所以時間複雜度是:o(n^log(b,a))=o(n),即時間複雜度是o(n)。
(3)log(b,a)=d --->複雜度為 o(n^d*logn)
(4)t(n)=2t(n/2)+o(n^2) 即d=2的時候,時間複雜度是:o(n^2)
剖析遞迴行為和遞迴行為時間複雜度的估算
乙個遞迴行為的例子 master公式的使用 t n a t n b o n d t n 是樣本量為n時的時間複雜度,n b是劃分成子問題的樣本量,子問題發生了a次,後面o n d 是除去呼叫子過程之外的時間複雜度。比如要求乙個陣列的最大值 public static int getmax int a...
剖析遞迴行為和遞迴行為時間複雜度的估算
乙個遞迴行為的例子 master公式的使用 t n a t n b o n d t n 是樣本量為n時的時間複雜度,n b是劃分成子問題的樣本量,子問題發生了a次,後面o n d 是除去呼叫子過程之外的時間複雜度。比如要求乙個陣列的最大值 public static int getmax int a...
遞迴行為的實質,以及如何分析遞迴行為(重點)
遞迴就是自己呼叫自己。遞迴函式就是 系統在幫忙壓棧,保護現場 舉乙個例子 題目 如何用遞迴的形式,在整個陣列中 找最大值,即在l到r範圍內找全域性最大值。思路 分別找到左 右面的最大值,然後比較這兩個值的大小。主程式 簡單介紹 先定義了乙個 arr陣列,值為4 3 2 1 然後呼叫getmax函式,...